IMyoungho 2019. 4. 3. 18:36

이번 문제는 Lotto이다!!

이번 문제를 푸는 열쇠는 바로 Logic Bug를 찾아내는 것이다.

lotto buffer가 랜덤값으로 바뀌기 때문에

Brute force 공격을 이용해야했다.




우선 코드를 보도록 하자!!


 < main 함수 >




< play 함수와 help 함수 >

이 문제의 열쇠는 빨간 산자의 play함수 내의 이중 for문이다.

취약점이라기 보다는 logic bug이다.


match라는 변수의 값이 6이되면 FLAG를 볼 수 있게되는데

랜덤 값인 lotto와 우리가 입력할 수 있는 submit를 비교해서

같으면 match값이 증가한다. 하지만 이 부분의 logic bug는

다음과 같다. 언뜻 보기에는 배열(1Byte) 하나씩 값이 같은지

비교하는 것 같지만 사실은 하나만 같아도 match를 6으로 만들 수 있다.



< 예시 >

예를 들어 lotto 버퍼가 "abcdef"일 때

submit 버퍼가 "aaaaaa"라면 코드 logic 상

하나만 맞더라도 6번 비교하면서 match가 6이된다. 


그러므로 첫 Byte만 Brute Force하는 Payload를 구성했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
 
= ssh("lotto","pwnable.kr",port=2222,password="guest")
 
for i in range (145):
    p = s.process("./lotto")
    p.recvuntil("3. Exit")
    p.sendline(str(1))
    p.recvuntil("Submit your 6 lotto bytes : ")
    payload = chr(i)*6
    p.send(payload)
    p.interactive()
 
cs



Payload를 진행하니 FLAG를 볼 수 있었다.~

반응형