when leak stdin & stdout

정말 뻘짓을 해서 적는다…

C
void *chunk = NULL;
printf("Content: %s", chunk);

문제중 다음과 같은 코드가 있었다.

따라서 chunk에 stdout의 변수주소 ( data 영역 주소 ) 를 넣어서 stdout의 Libc 상의 주소를 leak 할려고 했다. 근데 문제상에 그 전에 반드시 chunk 위치에 뭔가를 입력을 해야한다.

따라서 나는 그냥 A 하나만 입력한뒤에 send()로 보내고 뒤에 1바이트는 그냥 원래값으로 생각하면 되니깐 이라고 생각했다.

가령, 예를 들어

C
pwndbg> p &stdout
$1 = (<data variable, no debug info> *) 0x601010 <stdout@@GLIBC_2.2.5>
pwndbg> x/gx 0x601010
0x601010 <stdout@@GLIBC_2.2.5>: 0x000072af3c865760
pwndbg> 

다음과 같을때 0x601010 영역에 A 하나 보내도

0x000072af3c865760 ⇒ 0x000072af3c865741 이 될 태고 어차피 뒤에 60이라는 것은 알기에 ( 뒤에 3바이트는 안바뀌니깐 )

여기서 0x601010 영역을 문자열로 출력하면 libc 주소 leak을 해서 libc_base를 출력할 수 있을거라 생각했다. 그럼 여기서 틀린 점이 뭘까?

바로.. 진짜 stdout 값이 바뀐다는 것이다.

C
printf("Content: %s", chunk);

실제로 이걸 실행할때 stdout의 주소를 0x601010 영역에서 읽어오는데 이 값이 바뀌어 있으니, stdout이 망가져 출력이 되지 않거나, segfault가 발생한다.

와… 이걸로 3시간 해맸다…