-
FTZ . level9 정리Pwnable/FTZ 2020. 2. 11. 05:26
login : level9
password : apple
< hint 확인 >
가장 먼저 ls 명령어를 통해서 파일들을 확인해보자
[level9]$ ls hint tmp [level9]$ cat hint
hint 를 확인해보면 (strncmp : 문자열을 비교하는 함수 / fgets : [저장할 변수, 데이터의 최대 크기, 입출력 방법])
// hint의 소스코드 #include <stdio.h> #include <stdlib.h> #include <unistd.h> main(){ char buf2[10]; char buf[10]; printf("It can be overflow : "); fgets(buf,40,stdin); if ( strncmp(buf2, "go", 2) == 0 ) { printf("Good Skill!\n"); setreuid( 3010, 3010 ); system("/bin/bash"); } }
여기서 중요한것은 if 문을 실행시켜야 한다는 것이다!!
(buf2가 "go"라는 문자열이 2개가 있어야 if 문이 실행 될것이다.)
buf의 크기가 buf[10]; 으로 선언되었는데 fgets에서 40만큼의 데이터를 넣을 수 있게 해놨다.
이 부분을 이용해서 buf값을 더 많이 넣어 buf2에 원하는 값을 넣을 수 있게 하면 if 문이 실행 될 것이다.
buf랑 buf2의 크기가 주어졌으니까 이 두개의 값에 주의하면서 풀어보자!
// hint 소스코드 해석편 #include <stdio.h> #include <stdlib.h> #include <unistd.h> main(){ char buf2[10]; char buf[10]; printf("It can be overflow : "); fgets(buf,40,stdin); // buf에 최대 40만큼 표준입력 if ( strncmp(buf2, "go", 2) == 0 ) // buf2에 "go"라는 문자열을 최대 2개 비교한다. 같으면 0 { printf("Good Skill!\n"); setreuid( 3010, 3010 ); // 3010이 level10 id값 /etc/password로 확인가능 system("/bin/bash"); // /bin/bash 실행 } }
< tmp 파일에서 hint를 컴파일 해보자 >
[level9]$ vi bof.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> main(){ char buf2[10]; char buf[10]; printf("It can be overflow : "); fgets(buf,40,stdin); if ( strncmp(buf2, "go", 2) == 0 ) { printf("Good Skill!\n"); setreuid( 3010, 3010 ); system("/bin/bash"); } }
bof.c 파일을 만들어서 hint 내용을 넣는다. (wq!)
[level9]$ gcc -o bof bof.c // 컴파일 [level9]$ gdb bof // 분석? (gdb) set disassembly-flavor intel // 어셈블리어를 intel어로 보기 쉽게 변환 (gdb) disas main // main 어셈블리어로 확인
gcc 를 사용하여 컴파일을 실행한다.
gdb 를 사용하여 어셈블리어 확인!
결과값을 보기좋게 나타내면
0x08048420 <main+0>: push ebp 0x08048421 <main+1>: mov ebp,esp 0x08048423 <main+3>: sub esp,0x28 0x08048426 <main+6>: and esp,0xfffffff0 0x08048429 <main+9>: mov eax,0x0 0x0804842e <main+14>: sub esp,eax 0x08048430 <main+16>: sub esp,0xc 0x08048433 <main+19>: push 0x8048554 0x08048438 <main+24>: call 0x8048350 <printf> 0x0804843d <main+29>: add esp,0x10 0x08048440 <main+32>: sub esp,0x4 0x08048443 <main+35>: push ds:0x8049698 0x08048449 <main+41>: push 0x28 0x0804844b <main+43>: lea eax,[ebp-40] 0x0804844e <main+46>: push eax 0x0804844f <main+47>: call 0x8048320 <fgets> 0x08048454 <main+52>: add esp,0x10 0x08048457 <main+55>: sub esp,0x4 0x0804845a <main+58>: push 0x2 0x0804845c <main+60>: push 0x804856a 0x08048461 <main+65>: lea eax,[ebp-24] 0x08048464 <main+68>: push eax 0x08048465 <main+69>: call 0x8048330 <strncmp> 0x0804846a <main+74>: add esp,0x10 0x0804846d <main+77>: test eax,eax 0x0804846f <main+79>: jne 0x80484a6 <main+134> 0x08048471 <main+81>: sub esp,0xc 0x08048474 <main+84>: push 0x804856d 0x08048479 <main+89>: call 0x8048350 <printf> 0x0804847e <main+94>: add esp,0x10 0x08048481 <main+97>: sub esp,0x8 0x08048484 <main+100>: push 0xbc2 0x08048489 <main+105>: push 0xbc2 0x0804848e <main+110>: call 0x8048360 <setreuid> 0x08048493 <main+115>: add esp,0x10 0x08048496 <main+118>: sub esp,0xc 0x08048499 <main+121>: push 0x804857a 0x0804849e <main+126>: call 0x8048310 <system> 0x080484a3 <main+131>: add esp,0x10 0x080484a6 <main+134>: leave 0x080484a7 <main+135>: ret
이제 이걸 해석하면 되는데
나는 잘 모르겠다.
하지만 ebp 값을 보면 eax,[ebp-40] / eax,[ebp-24] 이 두가지 값을 확인 할 수 있다.
이 두 값의 차는 16!
그렇다면 16만큼 값을 채우고 if 문이 실행 될 수 있는 "go" 문자열을 넣으면 되지 않을까!?
level 10으로 가는 password를 얻어냈다!
interesting to hack!
'Pwnable > FTZ' 카테고리의 다른 글
FTZ. level 11 정리 (3) 2020.02.25 FTZ. 함수 프롤로그 / 함수 에필로그 (0) 2020.02.11