CTFshow-pwn入门-前置基础pwn32-pwn34

这篇具有很好参考价值的文章主要介绍了CTFshow-pwn入门-前置基础pwn32-pwn34。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FORTIFY_SOURCE

FORTIFY_SOURCE(源码增强),这个其实有点类似与Windows中用新版Visual Studio进行开发的时候,当你用一些危险函数比如strcpy、sprintf、strcat,编译器会提示你用xx_s加强版函数。

FORTIFY_SOURCE本质上一种检查和替换机制,对GCC和glibc的一个安全补丁。

目前支持memcpy, memmove, memset, strcpy, strncpy, strcat, strncat,sprintf, vsprintf, snprintf, vsnprintf, gets等。

默认Ubuntu16.04下是关闭的,测试发现Ubuntu18.04是开启的
gcc -D_FORTIFY_SOURCE=1  仅仅只在编译时进行检查(尤其是#include <string.h>这种文件头)
gcc -D_FORTIFY_SOURCE=2  程序执行时也会进行检查(如果检查到缓冲区溢出,就会终止程序)

FORTIFY_SOURCE(代码增强)
-D 1(开启缓冲区溢出攻击检查)
-D 2(开启缓冲区溢出以及格式化字符串攻击检查) ,通过数组大小来判断替换strcpy、memcpy、memset等函数名,来防止缓冲区溢出。

pwn32

CTFshow-pwn入门-前置基础pwn32-pwn34
我们首先还是先将pwn文件下载下来,然后拖进虚拟机加上可执行权限使用checksec命令查看文件的信息。

chmod +x pwn
checksec pwn

CTFshow-pwn入门-前置基础pwn32-pwn34
文件是64位的我们先拖进ida64反编译一下。

// main
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __gid_t v3; // eax
  const char *v4; // rax
  int v5; // eax
  int num; // [rsp+4h] [rbp-44h] BYREF
  char buf2[11]; // [rsp+Ah] [rbp-3Eh] BYREF
  char buf1[11]; // [rsp+15h] [rbp-33h] BYREF

  v3 = getegid();
  setresgid(v3, v3, v3);
  logo();
  v4 = argv[1];
  *(_QWORD *)buf1 = *(_QWORD *)v4;
  *(_WORD *)&buf1[8] = *((_WORD *)v4 + 4);
  buf1[10] = v4[10];
  strcpy(buf2, "CTFshowPWN");
  printf("%s %s\n", buf1, buf2);
  v5 = strtol(argv[3], 0LL, 10);
  memcpy(buf1, argv[2], v5);
  strcpy(buf2, argv[1]);
  printf("%s %s\n", buf1, buf2);
  fgets(buf1, 11, _bss_start);
  printf(buf1, &num);
  if ( argc > 4 )
    Undefined();
  return 0;
}
// Undefined
void __cdecl Undefined()
{
  FILE *v0; // rax
  char flag[64]; // [rsp+0h] [rbp-48h] BYREF

  puts(
    "The source code of these three programs is the same, and the results of turning on different levels of protection are understood\n");
  puts("You should understand the role of these protections!But don't just get a flag\nHere is your flag:\n");
  v0 = fopen("/ctfshow_flag", "r");
  if ( !v0 )
  {
    puts("/ctfshow_flag: No such file or directory.");
    exit(0);
  }
  fgets(flag, 64, v0);
  puts(flag);
}

我们先来分析一下代码的逻辑:
程序打印出logo的信息,然后然后将第一个参数argv[1]也就是我们启动程序输入的第一个参数(其实还有argv[0]的,这个参数是每个程序的都一定会有的,并且值为程序名称)赋给v4,并且没有长度限制。之后程序将v4[10]的数组内容赋给buf1[10]数组,再将CTFshowPWN通过strcpy函数赋给buf2,接着打印输出buf1和buf2。再然后通过strtol(argv[3], 0LL, 10)将我们启动程序传入的第三个参数转为10进制赋给v5,紧接着使用memcpy函数将argv2的v5个字符赋给buf1,v5是int型,数值就是上条语句的得来的;然后再通过strcpy函数argv[1]我们输入第一个参数赋给buf2,之后再打印输出buf1和buf2,最后读取_bss_start 11个字符给buf1,打印输出buf1和num的信息。最最后通过if判断argc是否大于4(默认情况下argc是等于1的,因为argv[0]必定存在,我们输入一个参数,argc就会等于2,依次递推),如果大于4,就会进入Undefined函数,Undefined函数的作用就是输出flag了。

因为本题目FORTIFY_SOURCE没有开启,代表我们启动函数直接输入4个参数(这时argc=5 > 4)就行了,而且这4个参数没有长度限制,如果开启FORTIFY_SOURCE就不好说了,因为开启了之后,由于程序存在strcpy和memcpy函数会检测长度,如果长度超过了限制,可能会使程序抛出异常而退出执行。

那么这道题目我们就直接输入4个参数就行了。

先ssh连接上主机。

ssh ctfshow@pwn.challenge.ctf.show -p28160

CTFshow-pwn入门-前置基础pwn32-pwn34
这里我们使用ls看了下目录存在pwnme文件这个文件就给我们之前下载的pwn文件是一样的,我们运行随便加上4个参数就行了。

./pwnme 1 2 3 4

CTFshow-pwn入门-前置基础pwn32-pwn34
这时程序会停在这里,我们直接一个回车就行了。

CTFshow-pwn入门-前置基础pwn32-pwn34
OK,成功拿到了flag。

pwn33

CTFshow-pwn入门-前置基础pwn32-pwn34
题目已经告诉我们开启了FORTIFY_SOURCE=1,并说明在编译时进行一些安全检查,如缓冲区边界检查、格式化字符串检查等。 在运行时进行某些检查,如检测函数返回值和大小的一致性。 如果检测到潜在的安全问题,会触发运行时错误,并终止程序执行。

本题目的文件跟上道一样,pwn都是64位的,并且反编译出的代码也大致相似,这里就不详细分析反编译的代码了,但是它开启了FORTIFY_SOURCE=1,所以我们要注意源代码里的memcpy和strcpy函数。
CTFshow-pwn入门-前置基础pwn32-pwn34
memcpy和strcpy这两个函数被替换成了__mencpy_chk和__strcpy__chk安全函数,可以看到这两个函数相比前两个函数只是加上了11LL这个参数加以限制,因为buf1和buf2在声明的时候的长度就是11,所以程序为了防止溢出,使用后两个函数加上这两个数组的长度加以限制以防溢出。

那这个东西对于我们想要和上道题目一样输出flag完全是不没有任何阻碍的呀,我们就保证我们输入的第一个参数和第二个参数的长度不超过11就行了啊,只是上到题目没有开启FORTIFY_SOURCE,我们输入参数的长度是任意的,这道题目对我们的参数加以限制了而以。

我们直接ssh连接,运行pwnme加上不超过11长度的4个参数就行了(主要是参数1和参数2不超过11),那我们就和上道题目一样每个参数长度都为1呗。

ssh ctfshow@pwn.challenge.ctf.show -p28161

CTFshow-pwn入门-前置基础pwn32-pwn34

./pwnme 1 2 3 4

CTFshow-pwn入门-前置基础pwn32-pwn34
成功拿到了flag。

pwn34

CTFshow-pwn入门-前置基础pwn32-pwn34
本道题目指明了FORTIFY_SOURCE=2,在虚拟机用checksec命令检查如下:

CTFshow-pwn入门-前置基础pwn32-pwn34
题目描述也说了该程序包括基本级别的安全检查,并添加了更多的检查。 在编译时进行更严格的检查,如更精确的缓冲区边界检查。 提供更丰富的编译器警告和错误信息。
使用ida64反编译的加过略微与前两道题目有所不同,大部分还是一样的,还是把危险函数替换成了安全函数。如下:

CTFshow-pwn入门-前置基础pwn32-pwn34
__mencpy_chk和__strcpy__chk安全函数上道题目已经说过与memcpy和strcpy的区别,这里不再赘述。
__printf__chk该函数与printf的区别在于:
不能使用 %x$n 不连续地打印,也就是说如果要使用 %3$n,则必须同时使用 %1$n 和 %2$n。在使用 %n 的时候会做一些检查。
这个涉及到格式化字符串漏洞,本题涉及不到,所以对本道题也几乎阻碍不大,所以我们还是ssh之后运行文件时输入的4个长度为1的参数,不出意外还能到拿到flag!

ssh ctfshow@pwn.challenge.ctf.show -p28177

CTFshow-pwn入门-前置基础pwn32-pwn34

./pwnme 1 2 3 4

CTFshow-pwn入门-前置基础pwn32-pwn34
果然没有出意外hhh,拿到了flag!文章来源地址https://www.toymoban.com/news/detail-493713.html

到了这里,关于CTFshow-pwn入门-前置基础pwn32-pwn34的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python基础入门例程34-NP34 除法与取模运算(运算符)

    Python基础入门例程33-NP33 乘法与幂运算(运算符)-CSDN博客 Python基础入门例程32-NP32 牛牛的加减器(运算符)-CSDN博客 Python基础入门例程31-NP31 团队分组(列表)-CSDN博客 最近的博文:

    2024年02月05日
    浏览(33)
  • 2022CTF培训(九)MIPS PWN环境搭建&MIPS PWN入门

    附件下载链接 在 ARM PWN 环境搭建 的基础上,首先安装具备MIPS交叉编译gcc与MIPS程序动态链接库: 然后就可以正常运行 将 mipsel 添加到 qqemu-binfmt,这样 linux 可以根据文件头找相应的程序运行: 栈溢出 分析汇编可知,返回值存储在 $sp + 0x3C 处,而 buf 起始位置在 $sp + 0x18 处,

    2024年02月11日
    浏览(47)
  • musl pwn 入门 (1)

    近年来,musl libc作为一个轻量级的libc越来越多地出现在CTF pwn题之中,其和glibc相比有一定的差距,因此本文我们就musl libc最常考的考点——内存分配,进行musl libc的源代码审计。 不同于glibc多达四五千行代码,大小超过10w字节的malloc.c,musl libc中的malloc.c大小甚至都不到1w字节

    2023年04月25日
    浏览(30)
  • kernel pwn入门

    Linux Kernel 介绍 Linux 内核是 Linux操作系统的核心组件,它提供了操作系统的基本功能和服务。它是一个开源软件,由Linus Torvalds 在 1991 年开始开发,并得到了全球广泛的贡献和支持。 Linux内核的主要功能包括进程管理、内存管理、文件系统、网络通信、设备驱动程序等。它负

    2024年02月12日
    浏览(43)
  • pwn入门小技巧

    我也是偶尔玩玩ctf,所以也不会很难的,所以这篇主要是帮助刚开始学习的人学习吧 首先知识点包括:栈,堆,整数溢出,格式化字符串 目前ctf的题越来越偏向于实际,有的会使用刚刚爆出来的CVE漏洞的,所以不能只局限于glibc 所以可以大体分为两类把:libc,kernel 栈利用:

    2024年02月08日
    浏览(35)
  • Kernel pwn 入门 (3)

    这是一种绕过SMAP/SMEP和PXN防护的攻击方式。利用内核空间的direct mapping area(起始位置为0xFFF8880000000000)。Linux对内存的访问采用的是多级页表的方式,将某段物理内存映射到程序的虚拟内存空间中的某段地址。而在Linux内核空间中,还存在着direct mapping area这块区域,对于物理

    2024年02月06日
    浏览(41)
  • PWN学习之LLVM入门

    ①找到runOnFunction函数时如何重写的,一般来说runOnFunction都会在函数表最下面,找PASS注册的名称,一般会在README文件中给出,若是没有给出,可通过对__cxa_atexit函数\\\"交叉引用\\\"来定位: ②通过逆向,找到函数名及参数,编写基本exp ③找到漏洞,写利用exp.c,其中的pwn的目标是

    2024年02月05日
    浏览(23)
  • PWN入门&Protostar靶场Stack系列

    Protostar靶场地址 分析源码可以看见第8行,定义的字符串数组是64位。按照溢出的思路,我们应该是需要加一位字符串,也就是64位,这样子就可以溢出了。 而且通过11行可以看见,gets函数如果将继续存储字符当超过缓冲区的末端,将会影响计算机的安全。这是一个危险的函数

    2024年01月25日
    浏览(39)
  • windows pwn 基础知识

    winchecksec winchecksec 是 windows 版的 checksec ,不过有时候结果不太准确。 checksec(x64dbg) x64dbg 的插件 checksec 检查效果比较准确,并且可以连同加载的 dll 一起检测。 将 release 的插件按 32 和 64 位分别放到 x32dbg 和 x64dbg 的 plugins 目录,如果找不到 plugins 目录则打开调试器然后关闭

    2024年02月15日
    浏览(53)
  • ctfshow--web入门--文件上传

    目录 ctfshow--web入门--文件上传 web151(前端校验) web152(content-type) web153(.user.ini) web154(内容检测\\\'php\\\') web155(内容检测\\\'php\\\') web156(内容检测\\\'[\\\') web157(内容检测\\\'php\\\'\\\'[]\\\'\\\'{}\\\'\\\';\\\') web158(文件检测\\\'php\\\'\\\'{\\\'\\\'[\\\'\\\';\\\'\\\'log\\\') web159(日志包含) web160(日志空格检测) web161(日志文件头检测) web162web163(session包含) w

    2024年02月14日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包