NSCTF-Reverse02 超级详细且简单的办法搞定
沒有殼 VC寫的
觀察界面 一個編輯框 一個按鈕
拖進IDA 在導入表里找到GetDlgItemTextA
為什么找這個函數(shù) 因為這個函數(shù)的作用就是 獲取我們輸入編輯框的內容
雙擊進入 ctrl+X 交叉引用,然后F5看偽C代碼 就一個自定義函數(shù) 其他都是系統(tǒng)函數(shù) 我們直接進去
進去之后 發(fā)現(xiàn)就是把我們輸入的值分成兩隊 分別和 4030XX 這一串對0xx7異或的值 和 對0x33比較
但是我們不管這么多,直接看后面,這個if,很敏感的感覺到 flag就藏在這個 401000()函數(shù)里面,所以我們在if這一行按下TAB
直接拿到這個if的地址 進入OD 操作 ctrl+G 到剛才if的地址 下斷
跑起來,用這個灰色按鈕克星激活 GetFlag 按鈕, 按下按鈕走到斷點
發(fā)現(xiàn) 關鍵的比較 這不就是剛才判斷 V2+V1==3 嗎??
這里的eax是1 當然和 3不相等,那我們改成cmp eax,1,1和1比較肯定一樣鴨,所以不會跳轉。 (這里把jnz直接改成jz也可以達到同樣的效果)
?
繼續(xù)單步 就得到了flag 全程不用做任何運算
?
這里再介紹下另外兩種解法,就是通過計算得到flag。
第一種:
把byte_4030xx處的字符轉換一下進制顯示,byte_4030xx處字符分別為“JPFjXj2;9GWbN”
編寫破解代碼
#include <stdio.h>int main() {int i, j = 0;char str1[] = "JPFjXj2;9GWbN";char str2[20] = {0x00};for (i = 0; i <= 6; i++) {str2[j++] = str1[12-i] ^ 7;}for (i = 5; i >= 0; i--) {str2[j++] = str1[i] ^ 0x33;}printf("%s\n", str2);return 0; }把計算的結果填入編輯框 用按鈕克星激活GetFlag按鈕 就能得到flag了
第二種:
直接到這個解密函數(shù) sub_401000 里面看看
?發(fā)現(xiàn)就是將 7e0cad17016b0>?45?f7c>0>4a>1c3a0 與0x7的異或操作
(解釋下這里v4為什么等于這么多,Dst是已知的,位置是ebp-38h,v4的地址是ebp-29h,轉為十進制后,兩個差15位,所以左邊的 flag:{NSCTF_md5 這十五位去掉就是v4的值)
提醒一下 “}” 這個的ASCII 就是125
用python寫腳本,直接得到flag
a = "7e0cad17016b0>?45?f7c>0>4a>1c3a0" out = "" for i in a:out += chr(ord(i)^7) print out?
轉載于:https://www.cnblogs.com/tqing/p/11507709.html
總結
以上是生活随笔為你收集整理的NSCTF-Reverse02 超级详细且简单的办法搞定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由守卫 Maximum call st
- 下一篇: 分享四款H5怀旧小游戏魔塔+伏魔记+三国