栈溢出

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’长度

 

 
 
 
 
posted @ 2021-07-21 12:11  ATKevin  阅读(91)  评论(0编辑  收藏  举报