Netcat問題 - Linux

By Oscar
at 2016-06-13T12:51
at 2016-06-13T12:51
Table of Contents
※ 引述《luxylu ( 露西露 )》之銘言:
: 不好意思不知道該發在哪個版
: 想請教netcat的相關問題
: 最近在解一個CTF的題目
: 題目是nc xxx.xxx.xxx.xxx xxxx 之後會出現一個扔硬幣程式
: 只要連續猜對50次 就可以得到flag
: 目前我有扔硬幣的原始碼(xxx.c)跟另一個沒有副檔名的檔案(應該是shell之類)
: 我修改了xxx.c 並在我的電腦直行後 可以讓他cat flag(但我電腦沒flag)
: 我該如何利用nc 或其他的command
: 想辦法讓對方server去執行我修改過後的.c
: 或是有其它方法可以利用呢??
: 感謝各位大大給點提示
: 先謝過了
你好
剛好看到回一下
看完原始碼可以很快地發現漏洞在 printf(name) 這一行
這個漏洞叫做 format string exploit
簡單介紹一下
你可以想想看
正常 printf 的時候 stack 會長什麼樣子
printf("%x%x%x",a,b,c);
high
-------- -------------
| arg4 | | c |
-------- -------------
| arg3 | | b |
-------- -------------
| arg2 | | a |
-------- -------------
| arg1 | | "%x%x%x" |
-------- -------------
low
現在 printf 裡面沒有參數會造成什麼問題
printf(name);
假設你輸入的 name = "%x%x%x%x%x%x%x%x%x%x%x%x";
high
-------- ------------------------------
| xxxx | | local variable1(name[128]) |
-------- ------------------------------
| xxxx | | local variable2(buf[2]) |
-------- ------------------------------
| xxxx | | local variable3(seed) |
-------- ------------------------------
| xxxx | | ..... |
-------- ------------------------------
| name | | "%x%x%x%x%x%x%x%x%x%x%x%x" |
-------- ------------------------------
low
註: stack 我畫的很簡陋中間有一些 alignment 和 function call 預留的位置
要看 server 的那隻程式是怎麼編譯的
這時候 printf 會把在 stack 上的值當作參數印出來
就可以 leak 在 stack 上的值
這之中就包含 seed 的值
要是拿到 seed 的值
就可以預測出接下來 50 次的硬幣正反面
exploit 撰寫部分
可以用 pwntools 和 ctypes
pwntools 是專門用來寫 exploit 的工具
ctypes 讓你可以模擬 srand(seed) 的行為
以下是範例
from ctypes import *
cdll.LoadLibrary("libc.so.6")
libc = CDLL("libc.so.6")
libc.srand(seed)
for i in range(50):
print(libc.rand()%2)
自己動手樂趣多XD
加油!!!
seed 的位置可以用 objdump 看
或是用 gdb debug
如果還有疑問歡迎來信
--
: 不好意思不知道該發在哪個版
: 想請教netcat的相關問題
: 最近在解一個CTF的題目
: 題目是nc xxx.xxx.xxx.xxx xxxx 之後會出現一個扔硬幣程式
: 只要連續猜對50次 就可以得到flag
: 目前我有扔硬幣的原始碼(xxx.c)跟另一個沒有副檔名的檔案(應該是shell之類)
: 我修改了xxx.c 並在我的電腦直行後 可以讓他cat flag(但我電腦沒flag)
: 我該如何利用nc 或其他的command
: 想辦法讓對方server去執行我修改過後的.c
: 或是有其它方法可以利用呢??
: 感謝各位大大給點提示
: 先謝過了
你好
剛好看到回一下
看完原始碼可以很快地發現漏洞在 printf(name) 這一行
這個漏洞叫做 format string exploit
簡單介紹一下
你可以想想看
正常 printf 的時候 stack 會長什麼樣子
printf("%x%x%x",a,b,c);
high
-------- -------------
| arg4 | | c |
-------- -------------
| arg3 | | b |
-------- -------------
| arg2 | | a |
-------- -------------
| arg1 | | "%x%x%x" |
-------- -------------
low
現在 printf 裡面沒有參數會造成什麼問題
printf(name);
假設你輸入的 name = "%x%x%x%x%x%x%x%x%x%x%x%x";
high
-------- ------------------------------
| xxxx | | local variable1(name[128]) |
-------- ------------------------------
| xxxx | | local variable2(buf[2]) |
-------- ------------------------------
| xxxx | | local variable3(seed) |
-------- ------------------------------
| xxxx | | ..... |
-------- ------------------------------
| name | | "%x%x%x%x%x%x%x%x%x%x%x%x" |
-------- ------------------------------
low
註: stack 我畫的很簡陋中間有一些 alignment 和 function call 預留的位置
要看 server 的那隻程式是怎麼編譯的
這時候 printf 會把在 stack 上的值當作參數印出來
就可以 leak 在 stack 上的值
這之中就包含 seed 的值
要是拿到 seed 的值
就可以預測出接下來 50 次的硬幣正反面
exploit 撰寫部分
可以用 pwntools 和 ctypes
pwntools 是專門用來寫 exploit 的工具
ctypes 讓你可以模擬 srand(seed) 的行為
以下是範例
from ctypes import *
cdll.LoadLibrary("libc.so.6")
libc = CDLL("libc.so.6")
libc.srand(seed)
for i in range(50):
print(libc.rand()%2)
自己動手樂趣多XD
加油!!!
seed 的位置可以用 objdump 看
或是用 gdb debug
如果還有疑問歡迎來信
--
Tags:
Linux
All Comments

By Elizabeth
at 2016-06-15T05:11
at 2016-06-15T05:11

By Erin
at 2016-06-15T17:38
at 2016-06-15T17:38

By Hardy
at 2016-06-16T01:56
at 2016-06-16T01:56

By Callum
at 2016-06-18T15:17
at 2016-06-18T15:17

By Joseph
at 2016-06-23T01:33
at 2016-06-23T01:33

By Rachel
at 2016-06-24T02:41
at 2016-06-24T02:41

By Zenobia
at 2016-06-27T15:39
at 2016-06-27T15:39

By Poppy
at 2016-07-01T10:56
at 2016-07-01T10:56

By Linda
at 2016-07-04T10:13
at 2016-07-04T10:13

By Iris
at 2016-07-06T18:21
at 2016-07-06T18:21

By Ophelia
at 2016-07-09T23:34
at 2016-07-09T23:34

By Puput
at 2016-07-11T21:39
at 2016-07-11T21:39

By Lily
at 2016-07-13T16:29
at 2016-07-13T16:29

By Susan
at 2016-07-13T18:03
at 2016-07-13T18:03

By Hedwig
at 2016-07-17T07:26
at 2016-07-17T07:26

By Doris
at 2016-07-21T18:56
at 2016-07-21T18:56

By Daph Bay
at 2016-07-22T16:17
at 2016-07-22T16:17

By Blanche
at 2016-07-24T05:10
at 2016-07-24T05:10

By Anthony
at 2016-07-25T00:45
at 2016-07-25T00:45

By David
at 2016-07-27T09:53
at 2016-07-27T09:53

By Rebecca
at 2016-08-01T07:58
at 2016-08-01T07:58

By Odelette
at 2016-08-03T10:05
at 2016-08-03T10:05

By Ula
at 2016-08-07T11:21
at 2016-08-07T11:21

By Yuri
at 2016-08-08T09:04
at 2016-08-08T09:04

By Hamiltion
at 2016-08-12T15:27
at 2016-08-12T15:27

By Hazel
at 2016-08-16T01:02
at 2016-08-16T01:02

By Eden
at 2016-08-18T00:44
at 2016-08-18T00:44
Related Posts
kernel system call open

By Isla
at 2016-06-10T10:30
at 2016-06-10T10:30
電視盒接pi

By Doris
at 2016-06-10T00:02
at 2016-06-10T00:02
Netcat問題

By Barb Cronin
at 2016-06-08T19:44
at 2016-06-08T19:44
workqueue用法差別

By Anthony
at 2016-06-07T17:35
at 2016-06-07T17:35
請問在 Ubuntu 16.04 上面該怎麼跑 wine-staging 呢?

By Caitlin
at 2016-06-07T17:29
at 2016-06-07T17:29