일단 pwnable 바이너리가 나오면 무조건 IDA 로 살펴보는 습관을 들이자.
main함수의 내용을 IDA 를 통해 C로 출력한 모습이다.
read 함수를 통해 32byte를 입력받을 수 있게 해 놓았다.
[bp-4h] : ebp로 부터 4byte 만큼 떨어져 있다는 뜻이다.
그렇다면 gdb를 통해 확인해 보도록 하자.
r <<< $(python -c 'print"A"*20')
입력함수의 인자에 20byte를 채워보았다.
나중에는 계산해서 넣어주어야 하지만 지금은 그냥 게싱을 한다 생각하자.
20byte를 채워주니 ebp와 eip 의 값이 모두 바뀐 것을 확인할 수 있었다.
그렇다면 16byte로 다시 채워보자.
ebp는 채워졌으나 eip가 바뀌지 않았다.
그렇다면 20byte를 덮어씌웠을때 eip까지 모두 덮인다는 것을 확인할 수 있다.
다시 IDA로 넘어가서 분석해보자.
system 함수가 있는것으로 보아 RTL 공격이 통할 것 같다.
그렇다면 flag를 출력해주는 문자열이 어딘가에 존재할 것이다. 찾아보자
"/bin/cat flag" 라는 문자열이 존재한다.
자 이제 공격 코드를 삽입해 보자.
python -c 'print"A"*20 + "\x50\x83\x04\x08" + "AAAA" + "\x90\x85\x04\x08"'
앞에있는 함수의 주소는 뒤에있는 주소를 인자로 받고
"AAAA"라는 문자열을 리턴한다.
임의로 만든 flag 인 helloworld가 출력됬음을 확인할 수 있다.
※실습하기 전에 미리 flag 파일을 만들어 놓도록 하자~
'pwnable > 기타' 카테고리의 다른 글
songsari's prob2 (Command Injection) (0) | 2016.09.10 |
---|---|
songsari's prob1 (MEMORY_LEAK) (0) | 2016.09.10 |
RTL 심화 (0) | 2016.08.09 |
Format string (0) | 2016.08.09 |
echo is what? (0) | 2016.08.09 |