InsecureProgramming-master——abo1

本文通过构造特定字符串引发栈溢出,实现对程序控制流程的篡改,详细介绍了使用gdb进行调试的过程,并展示了如何编写shellcode来执行任意函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验说明

1、实验环境:

Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04

Codename: xenial

2、实验工具:

gdb

3、源码

首先看看abo1的源码:

/* abo1.c                                       *
 * specially crafted to feed your brain by gera */

/* Dumb example to let you get introduced...    */

int main(int argv,char **argc) {
	char buf[256];
	strcpy(buf,argc[1]);
}
为了省事,稍微修改了一下:
/* abo1.c                                       *
 * specially crafted to feed your brain by gera */

/* Dumb example to let you get introduced...    */
#include <string.h>
#include <stdio.h>
int hacked(void)
{
    printf("Congratulation! You have successed!\n");
    return 0;
}
int main(int argv,char **argc) {
	char buf[12];
	strcpy(buf,argc[1]);
	printf("Keep trying!\n");
	return 0;
}

4、实验目的

    通过构造字符串,实现栈溢出,从而执行函数hacked()。

5、编译:

二、调试

   1、首先使用disas main查看汇编代码:


2、在地址0x804847b处发现函数strcpy,使用b指令设置断点:



3、输入字符串“abcdef”开始单步调试:

    注意此时在0xffffcfcc处存储了main函数的返回地址0xf7e18637。

4、用c指令执行至0x804847a处


    此时eax的值0xffffcfa4即为buf的栈地址。

5、继续单步执行至0x8048480处:


    此时,已完成复制操作。

6、继续单步执行至0x804849b处:


    此时ECX=[EBP-0x4]=0xffffcfd0。

7、运行至0x804849f处,此时esp通过ecx获取了新值,即0xffffcfcc,而0xffffcfcc处正好存放着返回地址。


8、小结

    esp获得返回地址的栈地址的过程有些曲折,首先ecx=[ebp-0x4]=0xffffcfd0,然后,esp=[ecx-0x4]=0xffffcfcc,使用ecx作为了一个过渡。因此,我们需要修改[ebp-0x4]处的值,将此处的值改成我们需要跳转到的地址即可。

三、编写"shellcode"

    '\x3b\x84\x04\x08'+'c'*12+'\x98\xcf\xff\xff'


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值