pwnable.kr –flag

image-20220207212456021

这是一道简单的逆向题。

1.分析文件

先用pe分析一下文件。

image-20220207212720307

可以看出来文件是经过upx加壳的。

2.处理文件(脱壳)

1
2
3
4
5
6
7
8
9
10
11
┌──(root💀kali)-[/home/kali/桌面]
└─# upx -d flag\ \(1\)
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020

File size Ratio Format Name
-------------------- ------ ----------- -----------
883745 <- 335288 37.94% linux/amd64 flag (1)

Unpacked 1 file.

对文件进行脱壳

在linux系统下用**upx -d [文件名]**即可对文件进行脱壳。

3. 查看源代码

1
2
3
4
5
6
7
8
9
int __cdecl main(int argc, const char **argv, const char **envp)
{
char *dest; // [rsp+8h] [rbp-8h]

puts("I will malloc() and strcpy the flag there. take it.", argv, envp);
dest = (char *)malloc(100LL);
strcpy(dest, flag);
return 0;
}

源文件的main函数反汇编代码。

可以知道将flag复制到malloc开辟的动态内存区。

跟进flag字符串。

1
data:00000000006C2070 flag            dq offset aUpxSoundsLikeA

由跟进代码知道flag保存在数据段。

flag保存的数据是在aUpxSoundsLikeA偏移来的。

跟进aUpxSoundsLikeA数据。

1
2
3
.rodata:0000000000496628 aUpxSoundsLikeA db 'UPX...? sounds like a delivery service :)',0
.rodata:0000000000496628 ; DATA XREF: .data:flag↓o*

由代码知道,aUpxSoundsLikeA是只读数据段(read - only - data)。

解出flag。