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시간 해맸다…