1day1pwn-初级栈溢出

……

day0 jarvisoj-xmanlevel0

首先checksec,只开启了NX,64位ELF

扔进IDA看看,有一个很明显的vul_function,是一个read函数的栈溢出

同时还有一个callsystem函数直接调用/bin/sh

所以只需要覆盖vul_func函数的返回地址为callsystem即可。

查看栈大小为0x88,callsystem函数的地址为0x0000000000400596

exp:

 

day1 jarvisoj-xmanlevel1

首先checksec,仍然开启了NX(这里osx下的checksec貌似有点问题,实际应该是关闭了NX),32位ELF

同样有个vul_func,打印出了栈的起始地址,然后read函数有栈溢出

与level0不同的是没有一个直接调用shell的函数,但是打印出了栈的起始地址所以可以用shellcode

把返回地址设置为栈的起始地址,然后执行栈上布置的shellcode即可

exp:

番外:关于shellcode的编写

http://www.freebuf.com/column/142912.html

day2 XMAN2017资格赛-Taaaa

首先checksec还是只开启了NX,64位ELF

main函数中有一处明显的格式化字符串漏洞

main函数中还有一处直接调用shell,条件是之前被定义为68的v6参数的值为85

考虑用格式化字符串漏洞直接写入v6

番外:关于格式化字符串漏洞

http://www.jianshu.com/p/097e211cd9eb

day3 jarvisoj-xmanlevel3

checksec发现还是只开启了NX,32位ELF,题目给出了libc

read函数有一处栈溢出,栈不可执行,没有明显调用system的函数,考虑用ret2libc的方法找到libc中system的地址

第一步用write泄露出read在GOT表中的地址,计算出system的地址,再调用read写入bss段

番外:

关于PLT和GOT:http://www.freebuf.com/articles/system/135685.html

长亭的两篇栈溢出:https://zhuanlan.zhihu.com/chaitin-tech?topic=%E9%95%BF%E4%BA%AD%E7%A7%91%E6%8A%80

day4 jarvisoj-xmanlevel4

和level3一样的套路,只不过题目没有给出libc,需要用到pwntools里的DynELF模块

 

番外:

用DynELF实现无libc利用:http://bobao.360.cn/learning/detail/3298.html

day5 jarvisoj-xmanlevel2-x64

64位ELF,有system和/bin/sh的地址

64位与32位区别最大的是参数的传递,32位参数直接布置在栈上,而64位参数数量小的时候依次存放在rdi, rsi, rdx, rcx, r8, r9这6个寄存器中,所以要把/bin/sh传递给systm,我们需要把/bin/sh从栈上pop到rdi中,只需要寻找一个pop rid; ret的gadgets即可

 

day6 jarvisoj-xmanlevel3-x64

和32位的level3一个套路,只不过要注意参数的传递

 

day7 栈溢出基础套路总结

目前已经完成了栈溢出中最基本的几个套路的练习,包括溢出覆盖返回地址,栈上布置shellcode,格式化字符串,re2libc以及一点基本的ROP利用,做一个总结。

首先是栈的结构

[高地址]{caller栈}callee参数n -> 参数n-1 ... -> 参数1 -> 返回地址 -> ebp -> {callee栈}[低地址]

32位情况下被调用函数的参数直接写在栈中,64位情况下前六位依次保存在寄存器中,之后的才布置在栈上。

格式化字符串:打印数据:%s %d 写入数据:%n
ret2libc:通过可输出的函数泄露某一函数已经加载在内存中的地址,根据地址计算偏移

ROP:寻找多种以ret结尾的gadgets,依次布置在栈上,后一个gadgets是前一个gadgets的返回函数。