sonysame 2016. 10. 12. 19:51


fgets로 79자만 받으므로 버퍼오버플로우 공격 문제가 아니다.

printf를 활용하는

포맷스트링어택을 해야 한다.



%8x를 4번 썼을때 41414141이 출력된다.


에그쉘을 만들어주고

에그쉘의 주소를 구한다.



에그쉘의 주소를 십진수로 바꾸면

엄청나게 큰 수가 나오므로,  두 수로 나눈다

f2c5 & bfff

0xf2c5=62149

0xbfff=49151

49151>62149 만족하지 않으므로

1bfff-f2c5=52538로 대체한다.



RET의 주소를 구하려 하였으나,

gdb에서 disas main이 먹히지 않는다.

구글링을 통해

이런 경우,,


<.dtors라는 것을 이용한다고 한다>를 깨달았다.

 .dtors는 main함수가 끝나고 실행이 되는 명령이 있는 곳이라고 합니다.

08049594+4 인곳이 RET이다.


0x08049598:RET이므로


0x08049598에 62149를 넣고

0x0804959a에 52548을 넣는다.

AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08이 40자 이므로

62149-40=62109

%62109c를 한 다음에 %n을 넣는다.==0x08049598에 62149를 넣는다.

그리고

%52538c를 한 다음에 %n을 넣는다.==0x0804959a에 52548을 넣는다.




끝~~~!!