add 문제입니다.

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  __int64 v4; // [rsp+8h] [rbp-78h]
  __int64 v5; // [rsp+10h] [rbp-70h]
  __int64 v6; // [rsp+18h] [rbp-68h]
  __int64 v7[11]; // [rsp+20h] [rbp-60h]
  unsigned __int64 v8; // [rsp+78h] [rbp-8h]

  v8 = __readfsqword(0x28u);
  setup();
  while ( 1 )
  {
    v4 = 0LL;
    v5 = 0LL;
    v6 = 0LL;
    memset(v7, 0, 0x50uLL);
    printf("Input: ", argv, v7);
    if ( (unsigned int)__isoc99_scanf((__int64)"%ld %ld %ld", (__int64)&v4, (__int64)&v5, (__int64)&v6) != 3 )
    // scanf로 3개의 인자 값을 받아오고, 정상적인 3개 인자가 들어오지 않으면 실행
      break;
    v7[v6] = v4 + v5; // v4와 v5를 더한 값을 v7 배열의 v6번째 자리에 입력
    argv = (const char **)v7[v6];
    printf("Result: %ld", argv);
  }
  result = 0;
  __readfsqword(0x28u);
  return result;
}

main 함수입니다.

 

그리고 찾아보니 win 함수도 있습니다.

그냥 일로 ret 주소를 바꾸라는거같네요.

 

v7[v6]인걸 보니 v6의 값을 바꿔서 ret주소에 가도록 하고? 그 값을 저 win 함수의 주소로 바꿔버리면 될 것 같습니다.

 

배열의 크기가 11개니, 11개 공간 + sfp + ret로 해서 v6가 13이면 될 것 같네요.

 

그리고? 이동할 주소를 gdb를 통해 찾아봅시다.

 

0x400822 라고 하네요.

이제 이걸 10진수 정수로 입력받으니 변환시켜서 입력해주면 될 것 같습니다.

 

4196386이네요 ㅎ

 

이렇게 하고 실행하면?

 

이렇게 나옵니다!

 

끄읕

'Hacking-기초 > [PWN] Pwnable.xyz' 카테고리의 다른 글

[PWN] xor (50pts)  (0) 2020.08.01
[PWN] note (50pts)  (0) 2020.07.30
[PWN] misalignment (50pts)  (0) 2020.07.28
[PWN] sub (50pts)  (0) 2020.07.28
[PWN] Welcome (50pts)  (0) 2020.07.28

+ Recent posts