君莫笑系列视频学习(4)

接下来,视频讲解的都是各个例子(https://space.bilibili.com/14500640/

(1)程序中自身就含有system函数和"/bin/sh"字符串
(2)程序中自身就有system函数,但是没有"/bin/sh"字符串
(3)程序中自身就没有system函数和"/bin/sh"字符串,但给出了libc.so文件
(4)程序中自身就没有system函数和"/bin/sh"字符串,并且没有给出libc.so文件

1.ret2text

ret2text即需要我们控制程序执行程序本身已有的的代码(.text)

 

nx则是no execution, 如果开启的话就不能让IP寄存器指向堆、栈

objdump -R 文件名    --->    可以查看文件中的函数

 

2.ret2shellcode

简介

ret2shellcode顾名思义,就是return to shellcode,即让程序中某个函数执行结束后,返回到shellcode的地址去执行shellcode,得到system(sh)的效果。

shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统shell。一般来说,shellcode 需要我们自己填充。

ret2shellcode的局限性在于,在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限,即通常情况下我们checksec程序是NX保护就关闭的,否则当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

 

这里是up主的笔记:

这个时候就有两个注意点
1NX:NX disabled
2 strncpy(buf2, &s, 0x64u);
第一句代表,我们把shellcode放在堆,栈或者其他数据段上,然后让IP寄存器指向那里就可以获得shell
第二句代码的意思是程序会把输入复制到buf2去,buf2是什么呢?
. bss : 0804A080 buf2 db 64h dup(?)
PIE:No PIE (0x8048000 )
PIE没有开启的情况下, bss段的地址是固定的,所以,我们把shellcode写入bss段,然后跳转过去就可以获得shell了
下面实际写一下exp
这里提一下 ,现代的操作系统,都默认开启了aslr保护措施,这个保护措施是由系统管理的,开启时,堆,栈,libc的地址会随机化
但是bss段没有随机化
这里要先确定多少偏移能够覆盖返回地址
这里提下,我是通过cyclic工具获取偏移的, 也可以手动计算
这里112个字节之后就是用来控制返回地址的数据,这个地址我们用buf2的地址,在前面112个字节里面放入shellcode
这里提一下, asm功能和系统, OS位数都有关,所以要指定程序的位数(设置binary)
pwntooLs的shellcraft模块提供了一些写好的shellcode ,大家可以去看文档,

 

3.ret2syscall(该题是静态链接)

ret2syscall,即控制程序执行系统调用,获取 shell。

 

静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。

动态链接是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。

 

所以在PWN中,如果是静态链接的题目,问题就变得非常简单了。

 

vmmap:查看现有的进程或者追踪新的进程查看其电脑内存使用

第一步,ROPgadget --binary rop -- ropchain,会生成了一个rop chain,只要我们让程序跳到这里开始执行,就可以获得shell

 

ret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system("/bin/sh"),故而此时我们需要知道 system 函数的地址。

 

 

4.ret2libc1

现在plt表中有system函数,但是参数不是‘/bin/sh’,但是程序中有‘/bin/sh’

 

内存中搜索字符串:ROPgadget --binary ret2libc1 --string '/bin/sh'

 

plt中放的是代玛 (如果在plt表中存在某个函数,我们用这个地址相当于直接使用这个函数)

got中放的是数据


然后后面的四个a是执行完system的返回地址,因为我们这里直接获得了shell,这个地址执行不到,陆使写
p32 (0x8049720)这里则是存放/ b1n/ sh的地址

 

将system函数的起始地址布局到栈上是,相当于这里去调用system函数,所以执行system函数之前会存放system函数的下一条指令的地址,再接下来是函数的参数

(该程序源代码:https://download.csdn.net/download/qq_43935969/12119259

 

5.ret2libc2

现在plt表中有system函数,但是参数不是‘/bin/sh’,但是程序中也没有‘/bin/sh’

但是程序有输入点,所以就考虑将‘/bin/sh’先输入到程序中,然后将地址给system做参数

 

这里就是执行了gets(elf. bss( )+0x100)
然后执行了system( elf. bss( )+0x100)
中间通过一个gadget连接起来
然后程序执行到gets的时候会等待我们输入
p. sendline( , /bin/sh\x00' )

 

research的最初想法:

pop eax的作用是平衡栈帧,因为get函数有一个参数,而在(3)中提到过,参数有多少,返回的时候就要add多少,pop eax就可以让esp+4,ret就可以结束get函数,而eip这里都还没变,所以继续执行112之后的作为返回地址

 

这是pwntools官网上对rop.search()的解释,因为‘/bin/sh’是两个字节,所以需要8位

rop可以结束栈帧,get函数结束

 

6.ret2libc3

没有system函数也没有‘/bin/sh‘,那我们就要找到对应的.so库获取库里面对应的system函数的地址和/bin/sh的地址。

 

思路:

1.泄露 一个调用函数的地址

2.获取 libc 版本

3.获取 system 地址与 /bin/sh的地址

4.再次执行源程序

5.触发栈溢出执行 system(‘/bin/sh’)
 

PIE没开,说明.text段、got表和plt表都是不变的

 

查看函数中各个表有哪些(有哪些函数):objdump -R 名字

 

泄露 一个调用函数的地址:

exp:

(a)0x8048618是mian的返回地址,泄露了put的地址后返回到main处再次执行

(b)接受到泄露的四个字节后要u32,解包

(c)0x15ba0b是binsh的偏移地址,是在gdb调试中算出来的

binsh程序中的地址 - libc的地址

(4)第二次重定位问题?所以偏移地址改变,104

 

【注:system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接指向某个具体的shell

done!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书文的学习记录本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值