私は、ソケットを接続し、ソケットでバイナリを受信し、このバイナリを読み取り、他のバイナリと比較して、ソケットで受信したバイナリがあるかどうかを確認するPerlプログラムを使用しています。見てください:
perlProgram.pl
# some code here ...
my $sock = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 666, Proto => 'tcp');
$sock->sockopt(SO_LINGER, pack("ii", 1, 0));
# some code here for another porposes...
# ...
read($sock, $buff, 0xfffff);
close($sock);
if (($v = index $buff, "\xC7\x44\x24\x08\x03\x00\x00\x00\xC7\x04\x24\x00\x00\x00\x00\x89\x44\x24\x04") >= 0) {
$offset = $v;
printf "your offset is %08x\n", $offset;
} else {
if (($v = index $buff, "\x89\x44\x24\x10\xA1\xBC\xA5\x0F\x08\x89\x44\x24\x04\xe8") >= 0) {
$offset = $v;
printf "your offset is %08x\n", $offset;
} else {
print "Could not find your binaries\n";
exit;
}
}
# more code here ...
このPerlプログラムは正しく実行され、私のバイナリはソケットに接続されていると確信しています。だから、私はCで同じコードを書きましたが、問題があります。CIでは、ソケットにバイナリがあるかどうかを確認できませんが、バイナリがソケットにあることは確かです。見てください:
sameProgramInC.c:
// some code here ...
char binaries_1[]="\xc7\x44\x24\x08\x03\x00\x00\x00\xc7\x04\x24\x00\x00\x00\x00\x89\x44\x24\x04";
char binaries_2[]="\x89\x44\x24\x10\xa1\xbc\xa5\x0f\x08\x89\x44\x24\x04\xe8";
int indexOf(const unsigned char *data_buffer, const unsigned int length, const unsigned char *needle, const unsigned int needlelen) {
unsigned int i, j, index=0;
for(i=0; i < length-needlelen; i++) {
if(data_buffer[i] == needle[0]){
index=i;
for(j=1; j < needlelen; j++){
if(data_buffer[i+j] != needle[j]){
index=0;
break;
}
}
if(index == i){
return index;
}
}
}
return index;
}
int main(int argc, char *argv[]) {
int sockfd, buflen;
struct hostent *host_info;
struct sockaddr_in target_addr;
unsigned char read_buffer[0xfffff];
if((host_info = gethostbyname(argv[1])) == NULL)
fatal("looking up hostname");
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
fatal("in socket");
target_addr.sin_family = AF_INET;
target_addr.sin_port = htons(PORT);
target_addr.sin_addr = *((struct in_addr *)host_info->h_addr);
memset(&(target_addr.sin_zero), '\0', 8); // zero the rest of the struct
if (connect(sockfd, (struct sockaddr *)&target_addr, sizeof(struct sockaddr)) == -1)
fatal("connecting to target server");
// some code here for another porposes...
// ...
printf("\n\t Attempting to read memory of the server...");
bzero(read_buffer, sizeof(read_buffer));
read(sockfd, read_buffer, 0xfffff);
index = indexOf(read_buffer, sizeof(read_buffer), binaries_1, sizeof(binaries_1));
if(index != 0){
printf("\n\t [+] your offset is 0x%08x", index);
} else {
index = indexOf(read_buffer, sizeof(read_buffer), binaries_2, sizeof(binaries_2));
if(index != 0){
printf("\n\t [+] your offset is 0x%08x", index);
} else {
printf("\n\t [-] Fail! Could not find your offset!");
}
}
// more code here
したがって、このCコードは私のPerlコードのようには機能しません。実行時にエラーは発生しません。Cコードだけでは、Perlコードのようなバイナリが存在するかどうかを確認できません。その後、私が使用しようmemmem
、とmemcmp
とstrstr
、だけでなく、作品はありません。なぜそれが機能しないのですか?なにが問題ですか?
sizeof(binaries_1)
検索部分文字列の長さとして指定する場合、末尾のゼロが含まれているので、に変更しsizeof(binaries_1) - 1
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加