더 이상 진전이 안됩니다
  for ( i = 0; i <= 1; ++i )
  {
    puts("----------------------------------------------");
    if ( i )
      v0 = "HARD";
    else
      v0 = "EASY";
    printf("-                 %s MODE                  -\n", v0);
    puts("----------------------------------------------");
    for ( j = 0; j <= 9; ++j )
    {
      s2 = (char *)&unk_4060 + 64 * (unsigned __int64)(unsigned __int16)sub_15D4();
      if ( i )
        v1 = "[REDACTED]";
      else
        v1 = s2;
      printf("Type this word as soon as possible: %s\n", v1);

IDA로 디컴파일 했을 때 s2 에 입력해야 할 단어가 들어가고, 하드모드에선 단어가 [REDACTED]로 가려져 보이지 않습니다. 때문에 s2 의 주소를 찾고, 그곳에 들어있는 값을 읽어서 pwntools 의 sendline으로 보내려고 하고 있습니다.

image.png

여기 보면 0x55555555ef20 이 주소는 항상 바뀌어서 이 곳을 읽는 것 같진 않고 0x7fffffffe108 이 주소가 s2가 들어있는 [rbp-0x58] 이라서 이 곳을 읽어야 하는 것 같습니다.

그래서 아래와 같이 익스 코드를 짰습니다

#!/usr/bin/python3
from pwn import *

#p = remote('host1.dreamhack.games', 23234)
p = process('./chall')
e = ELF('./chall')

rbp = 0x7fffffffe160
offset = 0x58

s2 = rbp - offset

#easy mode
for i in range(10):
    p.recvuntil('Type this word as soon as possible: ')
    ans = p.recvline().strip()
    print(f'{ans}')
    p.recvuntil('> ')
    p.sendline(ans)

#hard mode
for i in range(10):
    raw_data = p.read(s2, 100)  # read 100 bytes
    ans = raw_data.split(b"\x00", 1)[0]    #cut first null byte
    print(f'{ans}')
    p.recvuntil('> ')
    p.sendline(ans)

처음 이지모드에선 잘 되는데 하드모드에선 입력 대기 상태만 되고 더 이상 실행이 안되는 것 같습니다.

주소가 잘못된 건가요? 아니면 코드가 잘못된 건가요... 혹시 pwntools에서 메모리에 어떤 값이 쓰여 있고, 그 값을 읽을 수 있는 방법은 없을까요?

#gdb #pwntools #rev
작성자 정보
답변 1
avatar
🚫
대표 업적 없음

sub_15D4 해당 함수에서 리턴 되는 값을 EASY모드를 통해서 구할 수 있을 것 같습니다.

2025.02.27. 20:57
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기