GreekToMe

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; // esi
SOCKET v3; // eax
SOCKET v4; // edi
struct WSAData WSAData; // [esp+0h] [ebp-1A0h] BYREF
struct sockaddr name; // [esp+190h] [ebp-10h] BYREF

if ( WSAStartup(0x202u, &WSAData) )
return 0;
v2 = socket(2, 1, 6);
if ( v2 != -1 ) // socket初始化
{
name.sa_family = 2;
*(_DWORD *)&name.sa_data[2] = inet_addr("127.0.0.1");// 设置ip
*(_WORD *)name.sa_data = htons(2222u); // 设置端口
if ( bind(v2, &name, 16) != -1 && listen(v2, 0x7FFFFFFF) != -1 )// bind(端口绑定),listen(端口监听)
{
v3 = accept(v2, 0, 0); // 调用accept阻塞,等待客户端连接
v4 = v3;
if ( v3 != -1 )
{
if ( recv(v3, buf, 4, 0) > 0 ) // recv函数接受数据
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

💰

×

Help us with donation