GreekToMe
Created At :
Views 👀 :
Greek_to_me
angr使用,socket编程,TCP,Unicorn
Socket(套接字)是什么
它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现, socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭).
说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
注意:其实socket也没有层的概念,它只是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
在这道题目中有这段代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| SOCKET __cdecl sub_401121(char *buf) { SOCKET v2; SOCKET v3; SOCKET v4; struct WSAData WSAData; struct sockaddr name;
if ( WSAStartup(0x202u, &WSAData) ) return 0; v2 = socket(2, 1, 6); if ( v2 != -1 ) { name.sa_family = 2; *(_DWORD *)&name.sa_data[2] = inet_addr("127.0.0.1"); *(_WORD *)name.sa_data = htons(2222u); if ( bind(v2, &name, 16) != -1 && listen(v2, 0x7FFFFFFF) != -1 ) { v3 = accept(v2, 0, 0); v4 = v3; if ( v3 != -1 ) { if ( recv(v3, buf, 4, 0) > 0 ) return v4; closesocket(v4); } } closesocket(v2); } WSACleanup(); return 0; }
|
就是创建了一个监听本地TCP端口2222的套接字
再看汇编,比较容易分析出来整体的逻辑就是创建TCP通信,传入buf,实际上只传了buf[0],然后对loc_40107c进行异或再加34,然后进行一个校验,因此需要先知道传入的是什么,可以采用爆破的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import sys import socket import os ip='127.0.0.1' port=2222 for i in range(256): os.startfile("E:\\Edge\\buu\\greek_to_me.exe") s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((ip,port)) s.send(chr(i).encode('latin1')) data=s.recv(1024) s.close() if b'Congratulations' in data: print(chr(i).encode('latin1'),'',i,data) break
|
运行结果
1
| b'\xa2' 162 b"Congratulations! But wait, where's my flag?"
|
即应该传入162
然后开始调试![屏幕截图 2023-11-26 151125](E:\Note\BUU刷题记录\pic\屏幕截图 2023-11-26 151125.png)
写脚本传数据
1 2 3 4 5 6 7 8 9 10 11
| import sys import socket import os ip='127.0.0.1' port=2222
os.startfile("E:\\Edge\\buu\\greek_to_me.exe") s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((ip,port)) s.send(chr(162).encode('latin1')) s.close()
|
运行后找到loc_40107c
按c转化为code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| loc_40107C: ; CODE XREF: sub_401008+5B↑j .text:0040107C ; DATA XREF: sub_401008:loc_401029↑o .text:0040107C ; sub_401008+29↑o .text:0040107C ; sub_401008+3F↑o .text:0040107C mov bl, 65h ; 'e' .text:0040107E mov [ebp+var_2B], bl .text:00401081 mov [ebp+var_2A], 74h ; 't' .text:00401085 mov dl, 5Fh ; '_' .text:00401087 mov [ebp+var_29], dl .text:0040108A mov [ebp+var_28], 74h ; 't' .text:0040108E mov [ebp+var_27], 75h ; 'u' .text:00401092 mov [ebp+var_26], dl .text:00401095 mov [ebp+var_25], 62h ; 'b' .text:00401099 mov [ebp+var_24], 72h ; 'r' .text:0040109D mov [ebp+var_23], 75h ; 'u' .text:004010A1 mov [ebp+var_22], 74h ; 't' .text:004010A5 mov [ebp+var_21], bl .text:004010A8 mov [ebp+var_20], dl .text:004010AB mov [ebp+var_1F], 66h ; 'f' .text:004010AF mov [ebp+var_1E], 6Fh ; 'o' .text:004010B3 mov [ebp+var_1D], 72h ; 'r' .text:004010B7 mov [ebp+var_1C], 63h ; 'c' .text:004010BB mov [ebp+var_1B], bl .text:004010BE mov [ebp+var_1A], 40h ; '@' .text:004010C2 mov [ebp+var_19], 66h ; 'f' .text:004010C6 mov [ebp+var_18], 6Ch ; 'l' .text:004010CA mov [ebp+var_17], 61h ; 'a' .text:004010CE mov [ebp+var_16], 72h ; 'r' .text:004010D2 mov [ebp+var_15], bl .text:004010D5 mov [ebp+var_14], 2Dh ; '-' .text:004010D9 mov [ebp+var_13], 6Fh ; 'o' .text:004010DD mov [ebp+var_12], 6Eh ; 'n' .text:004010E1 mov [ebp+var_11], 2Eh ; '.' .text:004010E5 mov [ebp+var_10], 63h ; 'c' .text:004010E9 mov [ebp+var_F], 6Fh ; 'o' .text:004010ED mov [ebp+var_E], 6Dh ; 'm' .text:004010F1 mov [ebp+var_D], 0
|
得到flag
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 3049155267@qq.com