【逆向分析】BUUCTF 逆向题目 [BJDCTF2020]JustRE
2023-12-5 00:3:5 Author: 利刃信安攻防实验室(查看原文) 阅读量:4 收藏

【逆向分析】BUUCTF 逆向题目 [BJDCTF2020]JustRE

题目地址:

https://buuoj.cn/challenges#[BJDCTF2020]JustRE

https://files.buuoj.cn/files/b02a88388c5a572e39c2d40b8e9136fc/attachment.exe

首先,查壳

信息:     文件名: H:/第七届“强网杯”全国网络安全挑战赛/BUUCTF/[BJDCTF2020]JustRE/attachment.exe    大小: 40855(39.90 KiB)    操作系统: Windows(95)    架构: I386    模式: 32    类型: GUI    字节序: LE

使用IDA32打开文件

Shift+F12

.data:00407030 aBjdDD2069a4579 db ' BJD{%d%d2069a45792d233ac}',0

交叉引用

F5

sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0);

sprintf

把格式化的数据写入某个字符串

int sprintf( char *buffer, const char *format, [ argument] … );

字串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。

%% 印出百分比符号,不转换。

%c 整数转成对应的 ASCII 字元。

%d 整数转成十进位。

%f 倍精确度数字转成浮点数。

%o 整数转成八进位。

%s 整数转成字符串。

%x 整数转成小写十六进位。

%X 整数转成大写十六进位。

$money = 123.1

$formatted = sprintf ("%06.2f", $money); // 此时变数 $ formatted 值为 "123.10"

$formatted = sprintf ("%08.2f", $money); // 此时变数 $ formatted 值为 "00123.10"

$formatted = sprintf ("%-08.2f", $money); // 此时变数 $ formatted 值为 "123.1000"

$formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化为百分比

//把整数123 打印成一个字符串保存在s 中。

sprintf(s, "%d", 123); //产生"123"

可以指定宽度,不足的左边补空格:

sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"

当然也可以左对齐:

sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"

也可以按照16 进制打印:

sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐

sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐

#include <stdio.h>
int main() { // Use a constant for the buffer size const int bufferSize = 0x100; char String[bufferSize];
// Use snprintf to avoid potential buffer overflow int writtenChars = snprintf(String, bufferSize, "BJD{%d%d2069a45792d233ac}", 19999, 0);
// Check for snprintf failure if (writtenChars < 0 || writtenChars >= bufferSize) { fprintf(stderr, "Error: Buffer overflow or snprintf failure\n"); return 1; }
// Use fputs instead of puts for better control (no automatic newline) if (fputs(String, stdout) == EOF) { fprintf(stderr, "Error: fputs failed\n"); return 1; }
return 0;}

flag{1999902069a45792d233ac}

文章来源: http://mp.weixin.qq.com/s?__biz=MzU1Mjk3MDY1OA==&mid=2247508409&idx=1&sn=91cc00e1dc80ad67b64dbc2379951c86&chksm=fbfb1174cc8c9862f254c05d915c65bb3af90419a800fe9bf1c17293a5d5a9e525871fde0f17&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh