序言

最近学逆向有些倦了,想多看看别的方向

1.moectfez_u64

在雪豹大佬的指导下尝试的这道题

现在vscode,ctrl+shift+p或者直接输入>输入wsl连接到wsl,要整出flag肯定要远程

1
2
3
4
5
6
7
8
9
10
11
from pwn import *#导入pwntools全部模块
context(os = 'linux', arch = 'amd64', level = 'debug')#设置配置和环境
p = remote('网址', 端口)#启动本地程序(Pwntools提供remote和process两种方法)
def itob(x):
return str(x).encode()
p.recvuntil('hint.')#程序输出直到知道到hint,将接收到的所有内容抛弃
code = p.recv(8)#接着接受8字节
ans = u64(code)#将接受的的8字节按照小端序解包为64位整数
log.debug(ans)#在debug层级输出
p.sendline(itob(ans))#将整数字符串字节发送给程序
p.interactive() #将控制权交给用户,手动与程序交互

直接python temp.py报了下先是[ERROR] ‘./pwn’ is not marked as executable (+x)exit

要切换到对应的文件夹cd,

linux每个文件均有读(r),写(w),执行(x)三种模式

要chmod +x temp.py

首先要搭建pwn的虚拟环境,vim ~/.bashrc设置一下

alias gopwn=”source /home/用户名/pwner/bin/activate”

运行后cat flag直接抓住远端flag

ls可以列出来

对不起,不小心做毒wp了,感谢雪豹大佬的指正

1
2
3
4
5
6
7
8
9
10
11
from pwn import *#导入pwntools全部模块
context(os = 'linux', arch = 'amd64', level = 'debug')#设置配置和环境
p = remote('网址', 端口)# ** 连接远程服务** 程序(Pwntools提供remote和process两种方法)
def itob(x):
return str(x).encode()
p.recvuntil('hint.')#程序输出直到知道到hint,将接收到的所有内容抛弃
code = p.recv(8)#接着接受8字节
ans = u64(code)#将接受的的8字节按照小端序解包为64位整数
log.debug(ans)#在debug层级输出
p.sendline(itob(ans))#将整数字符串字节发送给程序
p.interactive() #将控制权交给用户,手动与程序交互

2.栈

函数的调用过程中使用对战实现

3.简单x86汇编

内存与寻址

声明静态数据区

.DATA表示静态数据区

1
2
.DATA
X DW ?表示一个2字节未初始化值,referred to as位置X

汇编中仅存在一维数组,没有多维,其实就是内存中连续的区域

dup和字符串也是声明数组的两种的方法

1
2
arr     DD 100 DUP(0) 声明100个4字节开始于location arr,全初始化为0
str DB 'hello',0声明6字节开始于address str,为hello 和 null(0) btye

内存寻址

1
mov eax, [ebx] 将ebx存的值对应的值的内存存入eax寄存器

但是注意

1
2
mov eax, [ebx-ecx]      ; 只能对寄存器的值相加,不能相减
mov [eax+esi+edi], ebx ; 最多只能有 2 个寄存器参与地址计算

数据类型(大小)原话(SIZE Directives)

修饰指针类型

  • BYTE PTR - 1 Byte
  • WORD PTR - 2 Bytes
  • DWORD PTR - 4 Bytes

指令

三大类:

  • 数据移动
    1. mov
    2. push
    3. pop
    4. lea - Load Effective Address
  • 算术/逻辑运算
    1. add, sub
    2. inc, dec
    3. imul, idiv
    4. and, or, xor
    5. not(逻辑非)+操作数
    6. neg(补码取负)+操作数
    7. shl, shr
  • 控制流
    1. jmp
    2. je, jne, jz, jg, jl …
    3. cmp
    4. call, ret

调用约定(Calling Convention)

是个协议,规定了如何从调用到返回

C 调用约定:

  • 强烈依赖硬件栈的支持 (hardwared-supported stack)
  • 基于 push, pop, call, ret 指令
  • 子过程参数通过栈传递: 寄存器保存在栈上,子过程用到的局部变量也放在栈上

调用管理分为调用方(caller)与被调用方(callee)

(1)调用方规则

1.保存调用方的寄存器

2.将需要的子过程的参数入栈

3.使用call,调用子过程

子过程返回后

1.从栈上删除传递的参数

2.回复保存的寄存器

(2)被调用方的规则

1.将寄存器ebp的值入栈,然后copy ESP to EBP

1
2
push ebp
mov ebp, esp

2.在栈上为局部变量分配空间

3.保存的应有被调用方保存(callee-saved)的寄存器 —— 将他们压入栈。包括 EBX, EDI, ESI

完成以上任务后:

1.将返回值存到eax

2.恢复被调用方保存的寄存器

3.释放局部变量

4.恢复ebp(pop)

5.最高后执行调用方caller

4.数组越界

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<string.h>

int main() {

char passwd[10];
char username[10];

puts("Who are you?");
scanf("%s", username);

if(strcmp(passwd, "pwn") == 0)
puts("login in successfully");

else
puts("you failed");

return 0;
}

首先要关闭文件保护

1
gcc -no-pie -z execstack -fno-stack-protector -z norelro -U_FORTIFY_SOURCE 1.c -o pwn

直接输入aaaaaaaaaapwn溢出

要是开文件保护呢

gcc有个栈保护

1
2
3
char passwd[10]; // [rsp+4h] [rbp-1Ch] BYREF
char username[10]; // [rsp+Eh] [rbp-12h] BYREF
unsigned __int64 v6; // [rsp+18h] [rbp-8h]

passwd后面是v6,v6在溢出后会被修改,从而检验出数组越界

5.栈溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
void getflag()
{
int fd = open("flag", O_RDONLY);

char buf[100];
int n = read(fd, buf, sizeof(buf));
write(1, buf, n);
close(fd);
}
int main(void) {
char flag[0x8];
char buf[0x8];
puts("Now input something! Maybe I can give you a flag!");
gets(buf);
if(strcmp(flag,"YourFlag") == 0){
getflag();
printf("\nI know u can do this!\n");
}
else
{
printf("\nNothing.\n");
}
return 0;
}

要关闭文件保护

1
gcc -no-pie -fno-stack-protector 2.c -o 2

攻击

1.检测保护机制

1
checksec --file=2
1
2
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       FortifiableFILE
Partial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 41 Symbols No 0 2 2

STACK CANARY(栈缓冲区溢出保护)和位置无关(pie)保护关闭

2.break main之后ni(汇编中的步过)

显示的从上往下,第一块是寄存器,第二块是汇编,三是栈,四是调用的函数链

3.数组是从地址往高址存(rsp->rbp)

linux操作指令

1.文件管理器

ls:查看当前路径下的文件和文件夹,ls -l查看详细信息,ls -a可查看隐藏文件

cd:跳转路径,绝对路径可跳转到任意文件夹,相对路径仅能调准到当前文件夹

​ wsl会将windows系统放到/mnt文件夹下 cd /mnt/d跳转到d路径

​ cd ..会返回上一级目录

mkdir: 新建文件夹,mkdir project,会在当前目录创建一个project文件夹,

​ 要创建套娃式目录要加上-p,mkdir -p project/20260724/data,会在当前目录创建oject文件夹, o project文件夹内有一个20260716文件夹,20260716文件夹内又有一个data文件夹

rm:删除指令,删了没反悔,常见的是rm file,删除mkdir创建的文件夹rm -r project(r是递归)

​ -f表示强制执行,rm -rf /*表示直接结束网安生涯

mv: 移动文件,既能移动到其他文件夹下,又能改名,mv /path,/path可以是绝对路径也可以是相对路径

​ 与cd判定一至,mv file1 file2直接改名

cp为备份,与 mv一样,cp file /path但是cp复制过去的文件原文件还在原来的位置,递归复制是-r,-f是强制覆盖

​ cp -rf project /path

pwd 知道在那个目录远程环境入口为/root,输入pwd即可看见/roo,bash用户一直能看见,zsh用户显示目录

2.文件的查看与修改

cat:查看拼接,cat file1查看文件内容,cat file1 file2 > file3将文件1与文件2的内容拼接到文件

nano与vim均为文件编辑器,vim file,file不存在则创建file

​ 退出方式nano为ctrl+x然后输入Y确认然后回车,不保存修改则是ctrl+x后输入N;vim则是在英

​ 模式下**先按esc,然后输入:wq保存退出,:q!不保存退出,

tail 查看文件的尾部,tile file查看尾部10行的内容,tail -n 20 file查看尾部的20行tail -c n file查看尾部n字节

less 更适用于查看大文件的内容,输入q退出,更多快捷键按h,一分夜醒时打开文件

3.系统管理

kill:应用进程管理,kill PID(结束进程),搭配ps使用,ps查看进程

top:交互式的实时进程监督工具,可以动态显示 CPU、内存、负载和所有运行进程的状态

​ 直接输入top就可以查看运行中的进程占用资源

ps:查看某一时刻的所有进程信息,常用参数ps aux,ps -ef,前者可以查看cpu和内存占用,后者了解当前进程的父进程

uname:获取系统信息,uname -a显示所有的系统信息,快速确认自己正在操作什么操作系统、内核版本、硬件架构

su:切换到root用户

sudo:提权

4.网络相关

ping;连接一下,ping -c 4 发包四次

dig:Linux下最强的DNS(Domain Name System域名系统)查询工具,dig 网址检测DS解析是否有问题

​ dig+short +网址:直接显示DNS解析后的ip地址,dig -x ip反向解析ip对应的地址

nc:nc ip 端口号 快速链接

ip:可以查看网络接口、IP 地址、路由表、ARP 缓存等信息,并进行配置,ip addr show查看所有的网络接口和ip地址

curl基于uRL语法的文件传输工具,curl 网址支持 HTTP、HTTPS、FTP、SFTP、SMTP 等几十种协议。它被称为命令行下的”浏览器”

wget weget+下载链接,-O参数设置下载路径和文件wget -O /path/file

5.备份压缩

zip :ip 压缩包名称 要压缩的文件/目录,zip file.zip file1 file2 file3,可压缩多个文件,要压缩整个文件夹则要加上-r参数,zip -r file.zip /path/project/20260716/data/ ,加密压缩要加上-e,zip -e file.zip file

unzip:解密压缩,unzip file.zip,指定文件夹unzip file.zip -d /path

​ 解密加密文件夹,unzip -P password file.zip

7z: 强大的压缩解压缩工具,7z a file.7z -r /path压缩文件夹,7z a file.7z file压缩文件

​ 7z a -ppassword file.7z file加密压缩,7z x 压缩文件解密

gzip: gzip file.txt删除file.txt生成file.txt.gz仅能压缩单个文件

gunzip:gunzip file.txt.gz生成txt文件删除gz文件

tar仅打包不压缩,tar -cf file1.tar /path打包path下的所有文件为file1.tar

​ tar -czf file1.tar.gz /path(-z表示进行gzip压缩,对file1.tar进行gzip压缩)

unrar解压unrar x file.rar

7.软件与包管理

Debain、Ubuntu、kali操作系统是由apt包管理,更新管理器是apt update(获取最新的软件包的索引)

一般是以超级管理员更新sudo apt update,

么有更新的化执行sudo apt upgrade -y进行更新

下载应用是sudo apt install <app-name>

8.其他

ssh:安全外壳协议,不安全的网络上安全的执行网络服务ssh username@ip -p 端口号来连接到题目

env:输入env查看系统的环境变量

source file不加权限,直接运行脚本

chmod,sudo仍无法运行则要chmod +x 可执行文件