各种linux命令(pwn)
(gdb)bt //查看函数堆栈
(gdb)info break //查看断点信息
(gdb)x 0X804962c //相当于 *0X804962c
(gdb)x /20i $eip //查看接下来20条指令
(gdb)p system //打印出system函数地址
(gdb)vmmap //查看当前程序的heap,stack地址
(gdb)find addr(__libc_start_main) ,+22000000, string //在某个范围找string,返回地址
(gdb)delete 1(1-5) //删除断点
(gdb)b *address //根据地址下断点
(linux)绑定一个程序到端口:
socat TCP4-LISTEN:(10001)端口号,fork EXEC:(./level1)程序名
(gcc) -E //只进行预编译
(gcc) -no-pie //关闭pie
(IDA) G jump address //G键
(objdump) objdump -d -j .plt level2 //将level2的 plt表反汇编出来
(pwn题) 找程序本身是否调用了system()
(汇编理解)
call func---> push pc ,jmpfunc
leave---> mov esp,ebp pop ebp
Ret ---> pop ip
Checksec:
CANARY : ENABLED //canary 栈保护 在栈中的函数返回地址(eip)和基地址(ebp)之间插一个随机cookie
FORTIFY : ENABLED //在程序中判断数组大小,防止栈溢出
NX : ENABLED //栈堆不可执行 gcc中的 -z execstack 关闭NX
PIE : disabled //地址随机化,但是地址的后两位是不变的(十六进制)
RELRO : Full //保护GOT表
使用objdump和grep命令查看是否有与eax/esp相关的转跳指令:
$ objdump -d stack2 | grep *%eax
80483df:ff d0call *%eax
80484cb:ff d0call *%eax
$ objdump -d stack2 | grep *%esp
ldd level3 //查看level3使用的共享库文件
readefl -S level2 //获取各个段的地址
grep XXX //搜索指令
(gdb)set args 设置main函数参数