日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ReverseMe-120(base64解码表) 逆向寒假生涯(21/100)

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ReverseMe-120(base64解码表) 逆向寒假生涯(21/100) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 拖進ida
    • 經過一次base解碼(`sub_E61000`)
    • base64解碼表
    • 注意 :
    • 總結函數:
    • 異或0x25
    • 題目總結
    • base64代碼(含有解碼表)

拖進ida



用字符串"you_know_how_to_remove_junk_code"來和輸入值加密改變后的來比較

經過一次base解碼(sub_E61000)

base64解碼表


其實呢,它也就是作為base64表和ASCII表之間的一個橋梁作用,例如00值在這個base64解碼表第65個位置(解釋:在ASCII碼表排65,即‘A’,在base64表排00位置,也就這個對層關系)
注意:base64解碼表和base64表不是一個意思,別混淆

// 解碼時使用 static const unsigned char base64_suffix_map[256] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,255, 254, 255, 255, 255, 0, 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, 255, 255, 255, 255, 255,255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255 }; if (c == 255) return -1;// 對應的值不在轉碼表中if (c == 253) continue;// 對應的值是換行或者回車if (c == 254) { c = 0; g--; }// 對應的值是'='

其實真正轉換關系應該是這樣


注意 :

這里的base字符轉化為的字節高2位為0,補上去的,這里的解碼思路和如下編碼思路差不多

if (i == inlen + pad_num - 3 && pad_num != 0) {if(pad_num == 1) {*(p + 1) = base64_alphabet[(int)(cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4))];*(p + 2) = base64_alphabet[(int)cmove_bits(*(indata + 1), 4, 2)];*(p + 3) = '=';} else if (pad_num == 2) { // 編碼后的數據要補兩個 '='*(p + 1) = base64_alphabet[(int)cmove_bits(*indata, 6, 2)];*(p + 2) = '=';*(p + 3) = '=';}} else { // 處理正常的3字節的數據*(p + 1) = base64_alphabet[cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4)];*(p + 2) = base64_alphabet[cmove_bits(*(indata + 1), 4, 2) + cmove_bits(*(indata + 2), 0, 6)];*(p + 3) = base64_alphabet[*(indata + 2) & 0x3f];}

只不過上方用了一個base64解碼表直接作為橋梁,就解決了這個問題。

總結函數:

也就是說,這個函數作用就是一個base64解碼作用。

異或0x25

這個學過ARM的人都知道,load和store的作用,后面外加一個xor,而v5就是0x25


直接異或即可。。

下方這個for循環不滿足條件不會執行:

題目總結

你的輸入---->base64解碼---->得到v13---->與0x25異或---->與“you_know_how_to_remove_junk_code”比較---->結果

#include <iostream> #include<Windows.h> int main() {unsigned char a[] = { "you_know_how_to_remove_junk_code" };unsigned char b[32];for (int i = 0; i < 32; ++i) {b[i] = a[i] ^ 0x25;std::cout << b[i];} }

\JPzNKJRzMJRzQJzW@HJS@zOPKNzFJA@ XEpQek5LSlJ6TUpSelFKeldASEpTQHpPUEtOekZKQUA=

base64代碼(含有解碼表)

// // base64.c // base64 // // Created by guofu on 2017/5/25. // Copyright ? 2017年 guofu. All rights reserved. // /*** 轉解碼過程* 3 * 8 = 4 * 6; 3字節占24位, 4*6=24* 先將要編碼的轉成對應的ASCII值* 如編碼: s 1 3* 對應ASCII值為: 115 49 51* 對應二進制為: 01110011 00110001 00110011* 將其6個分組分4組: 011100 110011 000100 110011* 而計算機是以8bit存儲, 所以在每組的高位補兩個0如下:* 00011100 00110011 00000100 00110011對應:28 51 4 51* 查找base64 轉換表 對應 c z E z* * 解碼* c z E z* 對應ASCII值為 99 122 69 122* 對應表base64_suffix_map的值為 28 51 4 51* 對應二進制值為 00011100 00110011 00000100 00110011* 依次去除每組的前兩位, 再拼接成3字節* 即: 01110011 00110001 00110011* 對應的就是s 1 3*/#include "base64.h"#include <stdio.h> #include <stdlib.h>// base64 轉換表, 共64個 static const char base64_alphabet[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G','H', 'I', 'J', 'K', 'L', 'M', 'N','O', 'P', 'Q', 'R', 'S', 'T','U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g','h', 'i', 'j', 'k', 'l', 'm', 'n','o', 'p', 'q', 'r', 's', 't','u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','+', '/'};// 解碼時使用 static const unsigned char base64_suffix_map[256] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,255, 254, 255, 255, 255, 0, 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, 255, 255, 255, 255, 255,255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255 };static char cmove_bits(unsigned char src, unsigned lnum, unsigned rnum) {src <<= lnum; // src = src << lnum;src >>= rnum; // src = src >> rnum;return src; }int base64_encode(const char *indata, int inlen, char *outdata, int *outlen) {int ret = 0; // return valueif (indata == NULL || inlen == 0) {return ret = -1;}int in_len = 0; // 源字符串長度, 如果in_len不是3的倍數, 那么需要補成3的倍數int pad_num = 0; // 需要補齊的字符個數, 這樣只有2, 1, 0(0的話不需要拼接, )if (inlen % 3 != 0) {pad_num = 3 - inlen % 3;}in_len = inlen + pad_num; // 拼接后的長度, 實際編碼需要的長度(3的倍數)int out_len = in_len * 8 / 6; // 編碼后的長度char *p = outdata; // 定義指針指向傳出data的首地址//編碼, 長度為調整后的長度, 3字節一組for (int i = 0; i < in_len; i+=3) {int value = *indata >> 2; // 將indata第一個字符向右移動2bit(丟棄2bit)char c = base64_alphabet[value]; // 對應base64轉換表的字符*p = c; // 將對應字符(編碼后字符)賦值給outdata第一字節//處理最后一組(最后3字節)的數據if (i == inlen + pad_num - 3 && pad_num != 0) {if(pad_num == 1) {*(p + 1) = base64_alphabet[(int)(cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4))];*(p + 2) = base64_alphabet[(int)cmove_bits(*(indata + 1), 4, 2)];*(p + 3) = '=';} else if (pad_num == 2) { // 編碼后的數據要補兩個 '='*(p + 1) = base64_alphabet[(int)cmove_bits(*indata, 6, 2)];*(p + 2) = '=';*(p + 3) = '=';}} else { // 處理正常的3字節的數據*(p + 1) = base64_alphabet[cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4)];*(p + 2) = base64_alphabet[cmove_bits(*(indata + 1), 4, 2) + cmove_bits(*(indata + 2), 0, 6)];*(p + 3) = base64_alphabet[*(indata + 2) & 0x3f];}p += 4;indata += 3;}if(outlen != NULL) {*outlen = out_len;}return ret; }int base64_decode(const char *indata, int inlen, char *outdata, int *outlen) {int ret = 0;if (indata == NULL || inlen <= 0 || outdata == NULL || outlen == NULL) {return ret = -1;}if (inlen % 4 != 0) { // 需要解碼的數據不是4字節倍數return ret = -2;}int t = 0, x = 0, y = 0, i = 0;unsigned char c = 0;int g = 3;while (indata[x] != 0) {// 需要解碼的數據對應的ASCII值對應base64_suffix_map的值c = base64_suffix_map[indata[x++]];if (c == 255) return -1;// 對應的值不在轉碼表中if (c == 253) continue;// 對應的值是換行或者回車if (c == 254) { c = 0; g--; }// 對應的值是'='t = (t<<6) | c; // 將其依次放入一個int型中占3字節if (++y == 4) {outdata[i++] = (unsigned char)((t>>16)&0xff);if (g > 1) outdata[i++] = (unsigned char)((t>>8)&0xff);if (g > 2) outdata[i++] = (unsigned char)(t&0xff);y = t = 0;}}if (outlen != NULL) {*outlen = i;}return ret; }

總結

以上是生活随笔為你收集整理的ReverseMe-120(base64解码表) 逆向寒假生涯(21/100)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。