【逆向分析】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}