没打bugku awd,听说今天没人打pwn题。既然但是有附件的话,我就看看。
打开程序发现相对以前有点意思,那就做一下。
程序很简单,输入一个ip地址,校验长度是否合法,然后校验ip是否合法,绕过了这两个检测就可以通过strcpy实现栈溢出。
int inet_pton(int af, const char *src, void *dst);
DESCRIPTION
This function converts the character string src into a network address
structure in the af address family, then copies the network address
structure to dst. The af argument must be either AF_INET or AF_INET6.
1 | _BOOL4 __cdecl validateSize(char *s) |
参数s的输入是fgets(s, 0x1FFFD, stdin)
实现的,s长度为0x1FFFE。
刚开始想着绕过validateSize(char *s)直接在合法地址后加一个’\x00’,strlen就不会继续识别了,但是后面的strcpy也是遇’\x00’截止,这样绕不会造成栈溢出。
仔细看代码发现,它会将’.’视作’\x00’校验,但不会动我们本身的字符串,而且v2是unsigned int_8,所以可以通过整数溢出来绕过检测。
我直接把绕过封装成一个函数。
1 | [*] '/home/giantbranch/Desktop/raoguo/pwn' |
NX关了而且有RWX段,第一反应是ret2shellcode,但是输入是在栈上,所以还是ret2libc
1 | import requests |
总结
整数溢出+基础栈溢出,inet_pton()虽然平时没遇到过,但是通过man一下就能知道是做什么的,拿数据试一下就行了。
没人打可能是因为靶机环境里没有ips.txt(那也太猪比了),也可能就是pwn手都不想打Bugku AWD了