技巧
工具
首先安装pwntools
安装pwndbg
安装pedagit clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
编译x86程序依赖
生成x86文件gcc -m32 -no-pie -fno-stack-protector -z execstack -o stack1 stack1.c
-no-pie会关掉PIE,-fno-stack-protector和-z execstack这两个参数会分别关掉Stack Protector和NX
找到返回地址
x86-如下
gdb ./pwn
‘a’*112+addr_ret
或者
或者
x64
生成shellcode
这个联网才可以
结果如下
例子(shellcode):
找内存中函数地址
这需要程序跑完,在gdb里p system
p callsystem
查看内存x\16x 0x482054
stack 100
x\s 0x482054
x \gx rsp
搭建pwn题目
查看是否开启随机化(不是0则开启)cat /proc/sys/kernel/randomize_va_space
关闭随机化echo 0 > /proc/sys/kernel/randomize_va_space
搭建题目socat tcp-l:4000,fork exec:./pwn
连接测试nc 127.0.0.1 4000
coredump
在/etc/profile中加入以下一行,这将允许生成coredump文件ulimit -c unlimited
在rc.local中加入以下一行,这将使程序崩溃时生成的coredump文件位于/tmp目录下echo /tmp/core.%e.%p > /proc/sys/kernel/core_pattern
调试coredump文件gdb ./test test.core
x64找到溢出地点x \100x $esp-100
libc查询(然而我并没有查到)
查找到gadget
objdump -d babypwn4 | egrep "ret|pop"
read和write
|
|
ELF
|
|
gdb断点
|
|
学不完的套路
程序段
gdb里面的返向跑recored
程序流程ltrace ./le1
看调用了那些函数strace ./le1
制作 call syscall和shellcode
这里的\x00\x00\x00
坏字符
lay asm
gdb命令
开始
linux下shellcode的编写
1、在shellcode中不能出现/x00也就是NULL字符,当出现NULL字符的时候将会导致shellcode被截断,从而无法完成其应有的功能
2、有一个int $0x80来执行系统调用
程序
|
|
编译
|
|
gdb加载
|
|
研究 execve() 函数的执行过程
研究 exit() 函数的执行过程
windows的shellcode
|
|
文学修养
无边落木萧萧下,不尽长江滚滚来。
万里悲秋常作客,百年多病独登台。