write-up(rev)/reversing.kr

[reversing.kr] Easy ELF write-up

ssongk 2023. 8. 30. 23:29

IDA로 까보면 다음과 같습니다.

int __cdecl main()
{
  write(1, "Reversing.Kr Easy ELF\n\n", 0x17u);
  sub_8048434();
  if ( sub_8048451() )
    sub_80484F7();
  else
    write(1, "Wrong\n", 6u);
  return 0;
}
_BOOL4 sub_8048451()
{
  if ( byte_804A021 != 0x31 )
    return 0;
  byte_804A020 ^= 0x34u;
  byte_804A022 ^= 0x32u;
  byte_804A023 ^= 0x88u;
  if ( byte_804A024 != 88 )
    return 0;
  if ( byte_804A025 )
    return 0;
  if ( byte_804A022 != 124 )
    return 0;
  if ( byte_804A020 == 120 )
    return byte_804A023 == 4294967261;
  return 0;
}
ssize_t sub_80484F7()
{
  return write(1, "Correct!\n", 9u);
}

 

sub_8048451이 true를 리턴할 수 있도록 만들어주는 값을 역연산하면 됩니다.

다음과 같이 파이썬으로 역연산을 수행합니다.

(바이트 단위이므로 0xff로 마스크를 씌워줘야 함)

byte_804A020 = 120 ^ 0x34
byte_804A021 = 0x31
byte_804A022 = 124 ^ 0x32
byte_804A023 = (4294967261 ^ 0x88) & 0xff
byte_804A024 = 88
byte_804A025 = 0

print(chr(byte_804A020),end='')
print(chr(byte_804A021),end='')
print(chr(byte_804A022),end='')
print(chr(byte_804A023),end='')
print(chr(byte_804A024),end='')
print(chr(byte_804A025),end='')
L1NUX