-
-
[原创]蒸米ROP level 4 - 使用ROPgadget寻找gadgets
-
发表于: 2024-5-9 13:06 6735
-
ubuntu1~16.04.12
pwndbg
python
学习x86和x64的栈溢出的区别
x86是栈传参,x64是寄存器传参按顺序RDI、RSI、RDX、RCX、R8 、R9(寄存器不够会拿栈传参)如下面代码块,在计算栈溢出的时候需要额外加8
x64
X86
没有system函数需要去libc.so程序里寻找
systemaddr 打印system函数地址
vulnerable_function()漏洞函数
128+8才可以覆盖到rbp栈底,因为x64得把寄存器算进去
运行程序
0x7fc10a2b23a0 就是systemaddr打印的system
的内存地址。
systemaddr
函数是会打印system
地址可以使用这个地址减去libc.symbols['system']
得到libc的地址
由于程序里没有system函数所以可以通过libc.so里找到system函数和/bin/sh
得到后不能直接使用。
获得POP_rdi_ret0x0000000000021112
获取libc.so
解析文件
获得systemaddr 输出并获取偏移量
计算内存偏移量获取PopRdiret内存地址
构造payload
mov edx,
1101b
; n
mov esi,
4008C1h
;
"Hello, World\n"
mov edi,
1
; fd
call _write
mov edx,
1101b
; n
mov esi,
4008C1h
;
"Hello, World\n"
mov edi,
1
; fd
call _write
mov dword ptr [esp
+
8
],
0Dh
; n
mov dword ptr [esp
+
4
], offset aHelloWorld ;
"Hello, World\n"
mov dword ptr [esp],
1
; fd
call _write
mov dword ptr [esp
+
8
],
0Dh
; n
mov dword ptr [esp
+
4
], offset aHelloWorld ;
"Hello, World\n"
mov dword ptr [esp],
1
; fd
call _write
[
*
]
'/home/giantbranch/pwn/ROP_STEP_BY_STEP/linux_x64/level4'
Arch: amd64
-
64
-
little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (
0x400000
)
[
*
]
'/home/giantbranch/pwn/ROP_STEP_BY_STEP/linux_x64/level4'
Arch: amd64
-
64
-
little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (
0x400000
)
int
__cdecl main(
int
argc, const char
*
*
argv, const char
*
*
envp)
{
systemaddr(argc, argv, envp);
/
/
打印出System的地址
write(
1
,
"Hello, World\n"
,
0xDuLL
);
return
vulnerable_function();
/
/
漏洞函数
}
int
__cdecl main(
int
argc, const char
*
*
argv, const char
*
*
envp)
{
systemaddr(argc, argv, envp);
/
/
打印出System的地址
write(
1
,
"Hello, World\n"
,
0xDuLL
);
return
vulnerable_function();
/
/
漏洞函数
}
int
systemaddr()
{
void
*
v0;
/
/
rax
void
*
v2;
/
/
[rsp
-
8h
] [rbp
-
8h
]
v2
=
dlopen(
"libc.so.6"
,
1
);
v0
=
dlsym(v2,
"system"
);
/
/
system获得地址
printf(
"%p\n"
, v0);
return
fflush(stdout);
}
int
systemaddr()
{
void
*
v0;
/
/
rax
void
*
v2;
/
/
[rsp
-
8h
] [rbp
-
8h
]
v2
=
dlopen(
"libc.so.6"
,
1
);
v0
=
dlsym(v2,
"system"
);
/
/
system获得地址
printf(
"%p\n"
, v0);
return
fflush(stdout);
}
ssize_t vulnerable_function()
{
__int64 v1;
/
/
[rsp
-
80h
] [rbp
-
80h
] BYREF
return
read(
0
, &v1,
0x200uLL
);
}
ssize_t vulnerable_function()
{
__int64 v1;
/
/
[rsp
-
80h
] [rbp
-
80h
] BYREF
return
read(
0
, &v1,
0x200uLL
);
}
giantbranch@ubuntu:~
/
pwn
/
ROP_STEP_BY_STEP
/
linux_x64$ .
/
level4
0x7fc10a2b23a0
Hello, World
giantbranch@ubuntu:~
/
pwn
/
ROP_STEP_BY_STEP
/
linux_x64$ .
/
level4
0x7fc10a2b23a0
Hello, World
giantbranch@ubuntu:~
/
pwn
/
ROP_STEP_BY_STEP
/
linux_x64$ ROPgadget
-
-
binary libc.so
-
-
only
"pop|ret"
| grep rdi
0x000000000002026b
: pop rdi ; pop rbp ; ret
0x0000000000021112
: pop rdi ; ret
0x00000000000674a9
: pop rdi ; ret
0xffff
giantbranch@ubuntu:~
/
pwn
/
ROP_STEP_BY_STEP
/
linux_x64$ ROPgadget
-
-
binary libc.so
-
-
only
"pop|ret"
| grep rdi
赞赏
他的文章
看原图
赞赏
雪币:
留言: