栈溢出
ret2text
ida中 x 可以看到那个函数调用了这个函数
ret2shellcode
1.无NX,有rwx
2.有NX 用mprotect函数修改bss权限
https://blog.csdn.net/qq_45691294/article/details/111387593
有时候系统默认开aslr,将栈地址随机化,就不能将shellcode写在栈上
经典题目:
ez_pz_hackover_2016 比较考验对gdb的使用
jarvisoj_tell_me_something wp:https://www.cnblogs.com/xlrp/p/14273682.html 汇编程序后没有leave,然后发现其实是开头没有将esp压入栈中,所以不用加8个字节
ret2syscall
https://blog.csdn.net/qq742762377/article/details/84309401
x86 系统调用 (34条消息) Linux系统调用 int 80h int 0x80_xiaominthere的专栏-CSDN博客
x64 系统调用 linux/syscall_64.tbl at 16f73eb02d7e1765ccab3d2018e0bd98eb93d973 · torvalds/linux · GitHub
相关指令:
ROPgadget --binary ret2syscall --only "ret|pop" | grep eax
查询字符串:
1.ida中shift+f12到字符串界面用ctrl+f查询字符串
2.ROPgadget --binary ret2syscall --string "/bin/sh"
3. string [文件名] | grep [查询的字符串]
ret2libc
用libcbase+libc.symbols["system"] 或 one_gadget
注:字符串"sh"也可以用, next(elf.search(b"sh\x00")) 利用本文件中的'sh'使用
ret2libc3 有Libc文件 libcbase+next(libc.search(b"/bin/sh\0")) (\0要不要无所谓)
BUUCTF HarekazeCTF2019 babyrop2 这道题提示我,printf输出遇到00就很停止输入,所以有时候尝试泄露不同函数的地址或者用puts,read函数泄露地址
ret2csu
https://blog.csdn.net/qq_41202237/article/details/105913597
有时候用puts函数泄露时,有pop_rdi_ret就不用csu
当用write函数泄露时,会需要大量的rop链,若没有就需要用csu
call是调用给入地址里的函数地址,system同样。不能call后面直接加要调用的函数地址。
canary
注:1.canary的结尾一般为\x00,在64bit中,一般为7位,最后一位为0。
NX保护
当文件是静态编译时:1.用mprotect函数修改bss段的权限 2.用ret2syscall
srop
利用bytes,不能用str(sigframe).encode()会报错
shellcode
Linux/x86 \x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80 --21bytes
mprotect
get_started_3dsctf_2016 - 不会修电脑 - 博客园 (cnblogs.com)
栈迁移
当有bss段时,可以迁移到bss段
没有时,就用迁移到现在这个栈得开头
栈迁移注意迁移后的地址尽量原理got表,防止函数调用后覆盖got表内容使程序崩溃。
eg: gyctf_2020_borrowstack
格式化字符串
fmtarg+地址
fmtstr_payload(offset, writes, numbwritten=0, write_size='byte') 第一个参数表示格式化字符串的偏移 第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:systemAddress}; 第三个参数表示已经输出的字符个数 第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写
eg:【技术分享】格式化字符串漏洞利用小结(一) - 安全客,安全资讯平台 (anquanke.com)
函数传参
32位函数的参数在栈上的布置隔一个单位,若需要多个函数传参,则需要pop_ret来。64位直接用pop_ret放到寄存器里即可
注:return + puts 接受数据时要多加一个recvuntil(b"\n"),因为Puts会自动换行
return 0就不用
用read函数时,sendline(b"/bin/sh\x00") 是9字节 因为还有一个回车
send(b"/bin/sh\x00")是8字节,没有回车
strings 文件名 | grep sh (在文件中寻找包含sh的字符串)
one_gadget 地址+文件名 (在用户文件中 直接用文件名)
flag不在根目录 用 find / -name flag 查找
有时候用sendline会输入一个'\n'
sendline
send
strcmp遇到不同字符或者‘\0'停止检查比较
strlen遇到'\0'停止,不算‘\0’长度