下面内容配合B站上的你有多想学pwn进行学习
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char sh[]="/bin/sh";
int init_func(){
setvbuf(stdin,0,2,0);
setvbuf(stdout,0,2,0);
setvbuf(stderr,0,2,0);
return 0;
}
int func(char *cmd){
system(cmd);
return 0;
}
int main(){
char a[8] = {};
char b[8] = {};
//char a[1] = {'b'};
puts("input:");
gets(a);
printf(a);
if(b[0]=='a'){
func(sh);
}
return 0;
}
需要用到的程序内容如上
gcc-a.out
如何将上面代码变为一个程序呢?使用gcc
先使用ls查看要执行的程序是否存在,存在以后我们去执行这个程序,而后再用ls查看就会多一个a.out的程序内容
执行这个程序,是让输入一些内容
gcc的-o命令,设置程序执行后的名字
使用-o命令生成我们想要的文件名
执行这个文件,输入相关内容
file命令
使用file命令,出现的内容包含:
ELF 64-bit LSB shared object:64位小端序的ELF文件
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2:动态链接,以及链接器的位置
BuildID[sha1]=6130301d5c74b4686c3a52363f52e86332057420:Hash数值
readelf -a quetion_1_64x |less
使用上面命令查看quetion_1_64x的具体内容
得到下面图中信息
64位的补码小端序的程序。IDA中能看到的内容,在这里都可以看到。使用-a可以全部查询到
nm命令
nm看的是一个过程
nm quetion_1_64x | less
hexdump-查看16进制
hexdump quetion_1_64x |less
以上就是执行代码
strings效果相同
和下面这个命令结果是一样的
strings quetion_1_64x |less
ldd命令-ldd较为常用和重要:查看用到的库函数位置
libc.so.6 是在这个 /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff9bfa96000)文件夹下
通过ll命令可以查看到
软链接,链接到:libc-2.31.so*
objdump
没有反编译工具之前使用的命令
objdump -d quetion_1_64x |less
将程序内容编译为汇编语言
这里就是main函数对应的编译语言
gcc查看汇编语言
现在一般很少有人用这个了,大部分都使用IDA来看了