0%

ctf二进制相关总结

Reverse

exeinfo:查位数、查壳

脱壳:upx

IDA:查找字符串/变量名、反编译成c

根据反编译的c代码写逆向脚本(……

Java class逆向得源码:jd-gui

Pwn

checksec:如果栈可执行可能有栈溢出

pwngdb:生成payload;

栈溢出

可能导致栈溢出的函数:gets/strcpy/read

利用方式:

  • 将栈溢出所在栈的ret值覆盖为危险函数所在的栈底
  • 覆盖条件语句,跳过判断
  • 覆盖指定变量值,绕过判断

pwngdb调试程序确认栈溢出所需偏移值(rsp-rbp)

ida确认目标函数/变量/指令的地址

编写exp,发送payload:填充值*偏移值+p64(危险函数地址)(可能有时候偏移量需要+1?

工具

Exeinfo PE

查壳!会显示是32位还是64位;是否有壳;甚至还有脱壳建议!

image-20231118202948520

UPX脱壳工具

http://upx.github.io

1
upx.exe -d [file_path]

IDA

啥都能反编译,Windows-exe,Linux-elf,macos,apk

shift+F12 查看string信息 (通常可以看到重要的信息 )

Alt + T 查找带有目标字符串的函数

Ctrl + F5 导出 C代码

Ctrl + F 在函数框中 搜索函数

X 定位函数-> F5 查看当前函数的c代码

空格键 流程图与代码 来回切换.

pwntools 2

Ubuntu18.04+python2

pwntools — pwntools 3.12.0dev 文档 (pwntools-docs-zh.readthedocs.io)

1
2
3
4
5
6
p32/p64:将16进制的数字转为\x字符格式(小端序)
process:运行本地程序,需要用pwnlib.context设置运行环境
remote:连接远程服务器
send/sendline 发送字符串
recv/recvline/recvuntil/ru
interactive

checksec

checksec检测文件的保护机制

RELRO:RELRO会有Partial RELRO和FULL RELRO,如果开启FULL RELRO,意味着我们无法修改got表和plt表

Stack:如果栈中开启Canary found,那么就不能用直接用溢出的方法覆盖栈中返回地址,而且要通过改写指针与局部变量、leak canary、overwrite canary的方法来绕过

NX:NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过

PIE:PIE enabled如果程序开启这个地址随机化(ASLR)选项就意味着程序每次运行的时候地址都会变化,而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址

FORTIFY:FORTIFY_SOURCE机制对格式化字符串有两个限制 (1)包含%n的格式化字符串不能位于程序内存中的可写地址。 (2)当使用位置参数时,必须使用范围内的所有参数。所以如果要使用%7$x,你必须同时使用1,2,3,4,5和6。

gdb-peta

常用命令

1
2
3
4
gdb [file]
pattern create [num] #生成多少个字节的payload
r/start+contin #启动程序
pattern offset [str] #偏移量