文章

pwn的杂记

这是我的一些pwn的随笔

先讲一些关于pwn的术语吧

  • payload(有效攻击负载)是包含在你用于一次漏洞利用(exploit)中的ShellCode中的主要功能代码
  • shellcode(可提权代码) 对于一个漏洞来说,ShellCode就是一个用于某个漏洞的二进制代码框架,有了这个框架你可以在这个ShellCode中包含你需要的Payload来做一些事情
  • exp (Exploit )漏洞利用,一般是个demo程序
  • poc.(Proof of Concept)漏洞证明,一般就是个样本 用来证明和复现
  • vul:(Vulnerability) :漏洞”Pwn”:是一个黑客语法的俚语词 ,是指攻破设备或者系统

gdb-peda 使用中的常用技巧

可以使用pattern_create()创建一个形如

pattern_create(200)
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAnAASAAoAATAApAAUAAqAAVAArAAWAAsAAXAAtAAYAAuAAZAAvAAwA'

的字符串,把他输入进程序就可以得到eip被误占所引发的错误。
再用pattern_offset 输入出错信息里的地址,就可以算出距离首地址的偏移
在简单的栈溢出中应当在覆盖完所有的临时变量后再顺便把bp(x86 4个 x64 8个)盖了
在叫完system以后会自动把其后的作为参数但是中间会需要加入参数中作为返回地址的数据(相当于传入四个字节换掉堆栈中的eip)(参数中字符串请用指针)。(当然64位中是不可以用的,因为64位中用寄存器传前七个参数)

64位自动对应p64 32位使用p32

sh.recvuntil(‘:‘)
address = sh.recvuntil(‘?‘, drop=True)
address = int(address, 16)

这样的方法可以获得写得起始点的地址,以确认shellcode的地址,免于重复运行计算
'sadsaddas'+'asdsadsda' == 'saddsdsdsdsa' 'asdasdasda
checksec 可以获得保护开启情况;

break *0x400100 (b main):在 0x400100 处下断点
tb一次性断点
info b:查看断点信息
delete [number]:删除断点
watch *(int *)0x08044530:在内存0x0804453处的数据改变时stop
x /4xg $ebp:查看ebp开始的4个8字节内容(b:单字节,h:双字节,w:四字节,g:八字节;x:十六进制,s:字符串输出,i:反汇编,c:单字符)
p $eax:输出eax的内容
set $eax=4:修改变量值start
ls -f 可以展示隐藏文件

gdb-peda常用指令(机翻)

c:继续运行
r:重新开始运行
ni:单步步过
si:单步步入
fini:运行至函数刚结束处
return expression:将函数返回值指定为expression
bt:查看当前栈帧
info f:查看当前栈帧
context:查看运行上下文
stack:查看当前堆栈
call func:强制函数调用
ropgagdet:找common rop
vmmap:查看虚拟地址分布
shellcode:搜索,生成shellcode
ptype struct link_map:查看link_map定义
p &((struct link_map*)0)->l_info:查看l_info成员偏移
libc :打印libc的基址
ld :打印ld的基地址
codebase :打印代码段的基础
heap :打印堆的基础
got :打印全局偏移表信息
dyn :打印动态部分信息
findcall :找到一些函数调用
bcall :在某个函数调用中设置断点
tls :打印线程本地存储地址
at :按进程名称附加
findsyscall :找到系统调用
fmtarg :计算格式字符串的索引
你需要停止有漏洞的printf。
force :计算力所在之处的nb。
heapinfo :打印堆的一些信息
heapinfo(竞技场地址)
默认是当前线程的舞台
如果启用了tcache,它会显示tcache条目的信息
heapinfoall :打印堆的一些信息(所有线程)
arenainfo :打印所有竞技场的一些信息
chunkinfo:打印块的信息
chunkinfo(受害者的地址)
chunkptr :打印块的信息
chunkptr(用户ptr的地址)
mergeinfo :打印合并信息
mergeinfo(受f害者地址)
printfastbin :打印fastbin的一些信息
tracemalloc on :跟踪malloc并释放并检测到一些错误。
你需要首先运行这个进程tracemalloc on,它会记录所有的malloc和free。
你可以设置DEBUGpwngdb.py,比打印所有的malloc和免费的信息如screeshot。
parseheap :解析堆布局
magic :在glibc中打印有用的变量和函数
fp :显示FILE结构
fp(文件的地址)
fpchain:显示FILE的链接列表
orange:中的测试house of orange条件_IO_flush_lockp
z() : 调出此时的调试界面
橙色(FILE的地址)
ctrl + c停止调试


栈是从高向低发展
栈溢出是从低向高溢出
而单个数据内部则是从高向低按字节存放的
而大多数的看内存的软件则是从低向高看的


ROPgadget 常用指令

  • binary
  • ropchain

格式: ROPgadget --binary the_binary_elf ropchain


程序中已经用到的会被link进程序固定的plt表

而没有被用到的也会被放在libc中,只需要无限leak即可找到system地址。

无限leak通常出现在栈溢出可以使程序重现进入该函数。


License:  CC BY 4.0