这是今年defcon上的一道200分的pwn题目,是一个linux 32位的elf程序,程序见附件 shitsco。
一、静态分析
首先运行程序,看大致程序的功能。如下图所示,这个程序提供了一个internet操作系统,支持一定的命令(enable,ping等)。
用ida分析程序,main函数:
main函数中主要有3个子函数。对这3个子函数依次分析。
第一个函数sub_80489d0:
很容易看出是读取了/home/shitsco/password中的内容,存入到804c3a0地址处。
第二个函数sub_8048c30:
这个函数主要是读取一行用户的输入。
第三个函数sub_8048a50:这个函数较为复杂,主要是对用户的输入进行解析。
首先观察ebp不是和平常程序一样作为栈帧使用,这里用了指向一块内存。而这块内存正好为系统支持的命令(enable)。
通过后面分析,发现此块内存为一个结构体数组,存储命令信息。
该结构体如下:
01 | struct CommandInfo |
02 |
03 | { |
04 |
05 | char *command;//命令名称,如enable |
06 |
07 | int unknown;//未见使用 |
08 |
09 | int Privilege; |
10 |
11 | int argc;//参数个数,如命令ping需要另一个参数 |
12 |
13 | pvoid handler; |
14 |
15 | } |
其中privilege是权限,如果为1表示命令需要enable成功后才能执行。内存804c3c0初始化为0,只有enable后,内存804c3c0才会变成1。
Handler表示该命令对应的处理函数。
最后以一个表统计了一下命令的信息:
Command |
Privilege | Argc | Handler |
enable | 0 | 1 | sub_8049230 |
ping | 0 | 1 | sub_80493E0 |
tracert | 0 | 1 | sub_8049330 |
? | 0 | 1 | sub_80490C0 |
flag | 1 | 0 | sub_8048D40 |
shell | 0 | 0 | sub_8048CF0 |
set | 0 | 2 | sub_80494A0 |
show | 0 | 1 | sub_8048E50 |
credits | 0 | 0 | sub_8048CA0 |
quit | 0 | 0 | sub_8048CD0 |
disable | 0 | 0 |
sub_8048CB0 |