攻防世界逆向入门题之getit

99 篇文章 32 订阅

攻防世界逆向入门题之getit

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向入门题的getit
在这里插入图片描述
下载附件,照例扔入exeinfope中查看消息:
在这里插入图片描述在这里插入图片描述
64位ELF文件,然后扔入IDA查看伪代码信息:
在这里插入图片描述
让我们来分析这段C代码含义:首先我看到的是strcpy(filename, “/tmp/flag.txt”);
stream = fopen(filename, “w”);
因为这里有flag字眼,所以我一下就看到了它,这里说写入了/tmp/flag.txt,也因为是tmp文件,所以不是管理员也可以写入,后面显眼的
fclose(stream);
remove(filename);
也说明了一运行完程序就删除文件,所以我们没法在运行完程序后找到该文件

现在分析中间的循环写入语句:

  for ( i = 0; i < strlen(&t); ++i )   //我是认为&t是flag的长度
  {
    fseek(stream, p[i], 0);    //定位到开头偏移p[i]位置处,
    fputc(*(&t + p[i]), stream);  //在上一句的定位处写入&t起始字符串的p[i]偏移的单个字节
    fseek(stream, 0LL, 0);    //重新定位到0且没有偏移
    fprintf(stream, "%s\n", u);	//写入完整字符u,双击跟踪u发现是*******************************************,就是一个覆盖干扰
  }

这里的p[i]双击跟踪长这个样子:(p[i]鼠标长时间停留显示int[43]类型):
在这里插入图片描述
hex图比较直观:
在这里插入图片描述可以看到p[i]数组存放的是无序的整数,也就是说每次在/tmp/flag.txt文件中写入的flag是不按顺序写的,且每次只出现一个字符,需要自己排序。

开头的循环判断中的&t在前面出现过,长这个样子:
在这里插入图片描述
我当时看着逼格挺高的,记得看不懂就没鸟了,后来发现前面的循环才是生成的flag代码,后面只是将flag分成单个单个字符写进去而已。
所以让我们分析一下前面代码:

  v9 = __readfsqword(40u);     //这里我也不清楚,是windows的API函数,从偏移量的指定位置读取内存相对 FS 段开头
  LODWORD(v5) = 0;     	//这里把__in64的v5(longlong型)转地址类型为32为DWORD,即取底32位为0
  while ( (signed int)v5 < strlen(s) )   //这里signed int是有符号整形,s双击跟踪是c61b68366edeb7bdce3c6820314b7498这样的无序字符串
  {
    if ( v5 & 1 )	//这里是v5的1位和1进行与操作,因为后面有LODWORD(v5) = v5 + 1,所以v3在这里会1、-1这样反复横条strlen(s)次
      v3 = 1;
    else
      v3 = -1;
    *(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;	//这里是赋值,因为v5一开始是0,所以从&t+10开始赋值,&t双击跟踪是SharifCTF{????????????????????????????????},第10位刚好是第一个?,赋值是从s[0]开始-1,s[1]+1,s[2]-1这样赋值,分别对应不断递增的v5和反复横跳的v3,所以这里也可以手动计算第一个?是b,第二个?是7这样。
    LODWORD(v5) = v5 + 1;   //v5底32位加1,其实就是v5加1
  }

好了,分析完了,有好几种做题方法,
第一个静态计算,就像我上面分析flag生成代码手动计算一样。

第二种动态截停,截止flag生成后的位置,查看寄存器即可。

第三种静态计算,仿写c语言脚本或python脚本安装一样的算法生成flag。

第四种动态截停,在IDA远程调试中截停在remove(filename);最后这里,或者return 0;也行,然后在IDA中写python脚本命令输出&t地址的字符串即可。

第五个动态截停,在linux中用GDB或IDA远程调试断点断在fprintf(stream, “%s\n”, u); 这里,然后每次记录写入的一个flag字符。

第一种就不说了,自己计算即可。

第二种:GDB动态调试,首先我们知道了下面strlen(&t)的t是flag程序运行后生成的flag,那我们把鼠标放在那一行上看一下下面的反汇编行数,如下所示是400824,那么我们在反汇编窗口跟上。
在这里插入图片描述在这里插入图片描述可以看到反汇编中400824行的确是_strlen函数,而它上面就是把&t移入了edi,所以在GDB中我们断点400824,然后查看edi寄存器即可。

所需命令:

b *0x400824
r

我这里用的是hyperpwn插件:
在这里插入图片描述
可以看到flag就在RDI寄存器里。

第三种:仿写C语言代码或python代码静态计算:
python代码:

key1="c61b68366edeb7bdce3c6820314b7498"
v5=0
flag=""
while v5 < len(key1):
	if v5 & 1:
		v3=1
	else:
		v3=-1
	flag+=chr(ord(key1[v5])+v3)
	v5+=1
print(flag)

在这里插入图片描述
C语言代码:(复制别人的)

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#pragma warning(disable:4996)

int main(void)
{
    char v3;
    __int64 v5;
    char s[] = "c61b68366edeb7bdce3c6820314b7498";
    char t[] = "SharifCTF{????????????????????????????????}";

    v5 = 0;
    while (v5 < strlen(s)) {
        if (v5 & 1)
            v3 = 1;
        else
            v3 = -1;
        *(t + v5 + 10) = s[v5] + v3;
        v5++;
    }
    printf("%s", t);

    system("PAUSE");
    return 0;
}

第四种在IDA处动态截停:
直接双击t看到?已经被替换成flag了,这里是断点在return在这里插入图片描述
或者在IDA下面输入框下输入get_bytes(0x6010E0,50)也一样能打印出对应地址的数组在这里插入图片描述
第五种:嗯~第五种就不演示了,大致像这个样子吧,不过他这个是整理过的,真实的是不按顺序出现的。
在这里插入图片描述

解毕!敬礼!

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
回答: 对于攻防世界pwn新手,其中一个关键是要修改全局变量pwnme的内容。通过格式化字符串的方法,可以实现这个目标。格式化字符串的原理是利用输入的格式化字符串,修改内存中的指定位置的值。具体的方法可以参考CTF-wiki上对格式化字符串的总结。另外,还可以利用栈溢出漏洞来实现攻击。栈溢出漏洞的原理是当输入的数据超过了栈的缓冲区大小时,会覆盖到相邻的内存区域,包括函数返回地址等重要信息。通过溢出覆盖system函数的参数为"/bin/sh",就可以获取到shell权限。在IDA32中,可以通过查看字符串窗口,找到可以直接利用的字符串,比如system和/bin/sh。这样就可以猜测需要溢出覆盖system函数的参数,实现获取shell的目的。123 #### 引用[.reference_title] - *1* *2* [xctf攻防世界pwn基础解(新手食用)](https://blog.csdn.net/lplp9822/article/details/89735167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [攻防世界 pwn 二进制漏洞简单练习区 答(1-10解)](https://blog.csdn.net/qq_33957603/article/details/122450397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐一 · 林

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

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

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

打赏作者

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

抵扣说明:

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

余额充值