티스토리 뷰

앞에서 설명드린 개념을 이해하셨다면 이제 이 문제를 혼자서도 해결하실 수 있을 것입니다.

그래도... 풀이는 해야하니...

소스코드는 (1)에서 보셨을테니 gdb로 바로 분석하면서 가보죠 !

main 함수의 leave; ret 부분과 problem_child 함수의 leave; ret 부분에 브레이크포인트를 걸어줍니다.
그리고 run `python -c 'print "B"*4 + "A"*36 + "\x40"'` 으로 실행해주세요.

앞의 두 부분은 problem_child 함수의 leave; ret 부분인데요. (1)에서 해드렸던 대로 분석해보세요.(아마 제가 (1)에서 언급했던 것들에 대해서 알 수 있으실 겁니다.)
아무튼 전 main 함수의 leave 전에 멈춰있습니다. leave 를 수행하기 전에 스택의 상황과 수행 후의 상황을 비교해보겠습니다.

수행 전입니다. 0x42424242 앞에 0xbffffb04가 있죠? 원래 정상적으로(ebp의 값을 침범하지 않는다면) leave가 수행된다면 ebp의 값은 0xbffffb04가 되어야 할 겁니다.
하지만, 저희는 마지막 값을 \x40 으로 바꿔서 전달했기 때문에 leave 과정 중에,
mov esp, ebp; pop ebp -> 에서 esp의 값이 0xbffffb40으로 바뀌기 때문에 pop 수행 시 위의 빨간 네모칸에 있는 2로 바뀌고 esp는 pop으로 인해 4가 증가하는 것입니다.
이후에는 뻔하죠 ? ret가 수행되면 esp의 값에 들어있는 주소로 점프해서 그 주소에 있는 것을 수행합니다.

예상했던 대로 수행되죠 ? 그리고 ret는 pop eip; jmp eip 를 수행하기 때문에 esp의 값이 4만큼 증가되어 있습니다.(나중에 다시 쓸 일이 있습니다. ret를 수행하면 esp 값이 증가한다는 것만 알아두세요.)
그렇다면 이것을 어떻게 공격해야할까요 ?
프로그램의 수행 과정을 대략 적어보면,
ebp 조작 -> esp 에 ebp+4 값이 들어감 -> esp 값 안에 있는 주소를 수행.
입니다. 바로 공격해보겠습니다.

공격성공했습니다.
저 같은 경우 원본 파일을 복사해놓고(이름 길이 똑같아야합니다.), dumpcode.h로 주소를 구한 후에 공격을 수행합니다. 그렇기 때문에 한 번에 공격에 성공하는 것이죠 !
왜 전달하는 인자의 앞 4 바이트가 0xbffffac8이고 ebp의 마지막 바이트를 \xc0 으로 바꾸는지 직접해보세요 ~

P.S. 이미 다 말씀드린 것이고 해본 것입니다. 특히, 프로그램의 수행 과정 ~ 부분에 있는 것을 잘 보시면 됩니다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함