如何在radare2执行dc命令后传入特定Payload?
如何在radare2执行dc命令后传入特定Payload?
嘿,我懂你现在的困扰——想在radare2里跑完dc让程序启动后,自动把你构造的格式化字符串Payload传进去,但之前试的两种方法都没生效,程序反而接收到了奇怪的默认输入对吧?别着急,我给你几个经过验证的可行方案:
方案一:修正rarun2配置,正确指定标准输入
你之前的rarun2配置里踩了个小坑:input字段其实是用来设置目标程序的命令行参数,不是标准输入!这就是为什么你的Payload没被程序读取到。我们换成rarun2专门用来指定标准输入的stdin字段就好:
方法1:直接在配置里生成Payload
先创建正确的profile.rr2配置文件:
#!/usr/bin/rarun2 program=./formattedctf stdin=$(python3 -c "print(b'\x4c\x40\x40\x00\x00\x00'.decode('latin-1') + '%3$n%6$n')")
然后启动radare2调试:
r2 -d formattedctf -e dbg.profile=profile.rr2
进入调试会话后执行dc,程序就会自动读取你构造的Payload作为输入了。
方法2:先存Payload到文件再引用
如果遇到转义问题导致Payload损坏,我们可以先把Payload写入临时文件,再让rarun2读取:
- 生成Payload到文件:
python3 -c "print(b'\x4c\x40\x40\x00\x00\x00'.decode('latin-1') + '%3$n%6$n')" > payload.txt
- 编写rarun2配置:
#!/usr/bin/rarun2 program=./formattedctf stdin=@payload.txt
之后同样用r2 -d formattedctf -e dbg.profile=profile.rr2启动调试,执行dc即可。
方案二:用radare2脚本灵活发送输入
如果你的程序是分多次读取输入(比如先问名字,后续还有其他交互),一次性的标准输入可能不适用。这时候可以用r2脚本,在dc之后手动发送Payload:
- 写一个
send_payload.r2脚本文件:
# 让程序运行到等待输入的节点 dc # 用`?i`命令发送构造好的Payload到程序标准输入 ?i `python3 -c "print(b'\x4c\x40\x40\x00\x00\x00'.decode('latin-1') + '%3$n%6$n')"` # 继续让程序执行 dc
- 启动调试并自动加载脚本:
r2 -d formattedctf -i send_payload.r2
这个方法自由度很高,适合复杂的交互式程序场景。
方案三:直接用管道传递Payload
这是最直接的方法,把Payload通过管道直接传给radare2,让程序的标准输入直接读取管道内容:
python3 -c "print(b'\x4c\x40\x40\x00\x00\x00'.decode('latin-1') + '%3$n%6$n')" | r2 -d formattedctf
进入调试会话后执行dc,程序就会自动读取管道里的Payload了。
备注:内容来源于stack exchange,提问作者allexj
相关产品推荐
相关产品推荐

