知识积累
程序员修养(好久没看了,生疏了有些地方得重新看)
学习pe,api,壳
SOMETHINGABOUT_JAVA/ANDROID
etc.
练手
android 做一些app
140个crackme
####
(我一定不会咕咕咕的
keen on hack and geek :~)
原来PWN题都是用ubuntu做的啊!入门以来的这个学期我都用的是kali真的是太捞了,期间出现了各种各样莫名其妙的问题,
这是我在XMAN4遇到libcsearcher时碰到搜索结果不匹配时发现的,尴尬的是组会时槐师傅(其实是所有师傅)都说用ubuntu,
原来他们以前有教过,谁叫我是半路出家,头铁的用了半年kali。
与X86最大的不同之处就是X64的地址,寄存器,数据,都变成了8个byte,更重要的是,为了防止对栈溢出的滥用,X64不再采用
X86的压栈式的传参方式,而是采用专用的寄存器保存函数的参数,它们是RDI,RSI,RDX,RCX,R8和 R9。只有参数数量大于6
个时才会使用栈保存后面的参数。
可以使用的内存地址不超过0x00007fffffffffff,否则会抛出异常(非法访问)。
存在任意长read,会导致栈溢出。
与X86类似,栈溢出覆盖返回地址,
为了达成某些目的,我们需要给调用的函数合适的参数,如’/bin/sh’,在X86中,直接将参数写在payload里面,伪造栈帧,因为
它通过压栈传参。而X64就要复杂一些,构造栈帧不再有效,需要将参数传入寄存器,而这就是我们寻找garget的原因。
garget就是程序中的一句汇编语句,可以连续执行,一条接着一条,形如:pop xxx;ret;达到给寄存器赋值的目的,还可以连续不断的
延伸下去。
对于这道题,由于采用了动态链接,程序本身并不大,所以找不到太多合适的garget,有一个操作就是在libc中寻找,libc多大啊,1
>ROPgarget --binary libc.so.6 --only "ret|pop" | grep "rdi"
因为我们的最终目标是执行system(“/bin/sh”)所以我们需要一个pop rdi;ret,这是可以找的到的。
程序提供了libc真实地址,libc偏移量计算与X86下计算方法相同。
再计算出”bin/sh”,pop_ret的真实地址,可以开始构建payload了。
‘a’*(0x90-4)+pop_ret_addr+binsh_addr+sys_addr
1 | from pwn import * |
read函数没有限制输入的长度,存在栈溢出。
关键点:sub esp,88h
lea eax,[ebp+buf]
ida说eax是read函数的buf,所以偏移量就是0x88,我们需要覆盖的是ret地址,中间还隔了一个ebp,所以padding为0x88+4。
由于是动态链接库,每次加载的基址都不一样,所以需要使用write泄露出某个libc函数的真实地址,再根据库中函数相当位置相同
推算出别的库函数的实际地址。
三个参数,通过栈传递,分别为:nbytes,buf,fd。在栈中的顺序大概是这样:
| 栈顶 |
| fd |
| buf |
|nbytes|
因此,我们要伪造的泄露write地址的栈帧为:
| 栈顶 |
| write@plt|
|return_add|
| 1 |
|write@got |
| 4 |
接下来程序输出的就是write的真实地址
pwntools中的计算基址的神器,用法:
ELF(“二进制文件路径”)
ELF.symbols[‘’] 查看函数地址
ELF.plt[‘’]同上
ELF.got[‘’]同上
libcsearcher模块:
libc.search(‘’)在库中寻找
write真实地址-write在libc中的地址=偏移量
计算到了偏移量,我们还不能停,因为重新加载程序会生成一个新的偏移量,所以这时我们要劫持程序
流程,再次进入vuln函数,所以return_add填入vuln的地址,再入vuln函数,再次栈溢出。
得到偏移量后,根据各函数在libc中的地址,我们很容易就能算出真实地址,接下来只需要调用system(/bin/sh)就完事了
system就一个参数,所以伪造的栈帧为:
| 栈顶 |
|return_add|
| bin_add |
由于执行完就getshell了,所以return_addr瞎填就行,只要是四个字节。
1 | #!/usr/bin/python |
有时候事情不会像我们预想的那样发生,就如我鸽了这么久的博客。
我的技术方向有了巨大的变化,很久没碰单片机,硬件电路之类的东西了,一方面是因为时间精力有限,另一方面因为这些东西挺麻烦的,等以后做项目的时候
可能才会重新再捡起来。现在的重心主要是放在二进制安全和数据科学方面,还是学到了不少东西的。
###~ifconfig at0 10.0.0.1/24 up
成功了,今天做了人生的第一个双力臂。狱龙的街健教程挺适合我的,臂力暴涨!
明天还有小测,不说多了。利用前两天的夜晚搭建了钓鱼AP,奇怪的是我的手机无法连接(卡在获取IP地址),电脑却可以连接
win10的平板也可以,虽热连接上了,但是网速很慢,甚至偶尔还会掉线,过几天再找解决方法吧,这几天有好多事要忙。