170910 WarGames-Utumno(2)

来源:互联网 发布:算法谜题 pdf 下载 编辑:程序博客网 时间:2024/06/07 00:15

1625-5 王子昂 总结《2017年9月10日》 【连续第342天总结】
A. WarGames-utumno
B.

int __cdecl main(int argc, const char **argv, const char **envp){  int v4; // [sp+14h] [bp-Ch]@4  if ( argc )  {    puts("Aw..");    exit(1);  }  strcpy((char *)&v4, argv[10]);  return 0;}

程序很简单,需要另argc=0后通过argv[10]溢出v4

查了一下如何令argc=0,在StackOverflow上看到了有提问:https://stackoverflow.com/questions/8113786/executing-a-process-with-argc-0
估计也是这个题目?
在最后提到了通过execv函数令argv指针为空指针即可,源码:

#include <stdio.h>#include <unistd.h>int main( void ) {    char *argv[]={ NULL };    execv( "/utumno/utumno2", argv );    return ( 0 );}

尝试写了一下 发现可以实现
反馈Segmentation fault
不过这样的话,argv[10]就不可能是参数了,回忆一下main的参数设置,实际上是env的第十个值(argv和env之间有一个NULL分隔)

那么接下来的问题就是构造env使其溢出到返回地址,以及找到payload的地址

ShellCode的构造问题

虽然IDA已经反汇编出v4的长度是0xC,似乎shellcode的分布只需要12(v4)+4(ebp保护值)+4(返回地址)+nop sled+payload就好
但是分析一下汇编就会发现,仍然存在老朋友:堆栈指针对齐
偏移范围在0-15个字节,因此还是要动态调试一下:

进入gdb,加载上述的noarg程序,直接运行可以得到segmentation fault的出错值
然后断main再运行
先断在noarg的main,c过掉以后就断在了utumno2的main了
查看argv参数,再查看第十个指针的值,发现出错值于12+4+8后
也就是说,对齐产生的偏移有8个字节

环境变量的存储结构

用env命令可以查看环境变量,结合分析内存可以知道
环境变量是以”name=value/0”的形式存储的,新插入的环境变量是无序的(至少不是先后和字母顺序)

这样的话,就只好以人海战术搞定了
本身系统的环境变量数量大概在十五个左右,批量创建二十(也可以更多)个环境变量后再用env命令确认第十个环境变量是否为我们创建的ShellCode

至于返回地址,我是粗暴地靠着大量的Nop Sled(每个Code中1000个Nop,20个Code)
这时候ShellCode中的返回地址基本可以在a段往后瞎写了(0xffffa000-0xffffdfff)
轻松getshell:

utumno2@utumno:~./n whoami
utumno3
$ cat /etc/utumno_pass/utumno3
zuudafiine

C. 明日计划
utumno

原创粉丝点击