pwnable.xyz - Grownup

pwnable.xyz 2021. 7. 23. 15:31

몇일간 고생하다 해답보고 이해한 문제이다. 포맷스트링에 대한 개념을 좀더 확실히 공부하고 넘어가야 할거같다. Decompile setup 함수 1. 0x601168의 주소를 usr에 넣고, usr의 인덱스 136~138에 %s\n을 세팅 main 함수 1. setup 함수를 실행하여 작업수행 2. local_28에 0x10만큼 입력받음 3. local_28의 맨 마지막을 NULL(0x0)으로 할당 4. local_28이 y 또는 Y인지 확인 5. malloc(0x84, 132)후 __src에 0x80(128)만큼 입력 받음 6. strcpy를 이용해 usr에 __src 값을 복사함 7. %s(usr.128_8)을 이용해 usr값 출력 Analysis 0x601100은 usr+0x20이고 0x20를 입력후..

Article Thumbnail
pwnable.xyz - misalignment

pwnable.xyz 2021. 7. 22. 00:06

Decompile 1. auStack.7_8_을 0xdeadbeef으로 초기화 2. 3개의 부호없는 정수를 받는다(%ld, long double) 3. 마지막 인자 * 8 + 48로 하는 auStack.7_8 배열의 인덱스에 첫번째와 두번째 인자 값을 더함 4. 만약 auStack.7_8_이 0xb000000b5면 win함수 실행(flag을 보여줌) 111 222 -5를 했을때 0xdeadbeef 위치에 덮인다. 하지만 마지막 ef때문에 한번에 덮어지지는 않는다. 때문에 두번에 나눠서 덮어야함 0xB000000B5 -> 0xB00000000과 0xB5로 나눌수 있음 하지만 ef때문에 다음 메모리 주소에서 침범하여 덮어야함 그래서 0xB500000000000000을 쓰고 0xB000000를 덮는다면 가능할..

Article Thumbnail
pwnable.xyz - add

pwnable.xyz 2021. 7. 20. 02:22

Mitigation 소스 코드 1. 29번째 줄에서 3개의 부호없는 정수(long)을 받는다 2. 첫번째 값 + 두번째 값을 더해 local_68배열에 넣는데 이때 세번째 인자(local_70)은 인덱스가 된다 공격 방식 세번째 인자를 받는데, 이때 이 local_70의 값 범위를 검사하지 않아 OOB 취약점이 일어나고, 이에 따라 원하는 곳에 값을 쓸 수 있게 된다. local_10은 카나리를 저장하는 변수이기 때문에 rbp-0x8의 위치를 가질것이다. local_68은 인덱스가 11이지만 OOB취약점 때문에 ret까지 덮을 수 있다. $RBP+RAX*0x8 -0x60주소에 rdx값이 들어가고, rdx는 세번째 인자이다. 따라서 0x60 / 0x8 = 13이고, 인덱스는 13이된다. 따라서 win 함수..

Article Thumbnail
pwnable.xyz - welcome

pwnable.xyz 2021. 7. 18. 12:01

Decompile malloc함수를 통해 할당받은 청크의 주소 출력 사이즈를 입력 받고, 그 사이즈를 인자로 한 malloc 반환 값은 레지스터들에 저장 message를 입력하면 청크에 저장이 된다. Decompile 사진을 보면 flag 출력 조건이 *pVar1이 0이면 플래그를 출력해준다. 첫 malloc(0x40000) 후 pVar1 값을 1로 초기화 해주는데, 이 값은 $rbx에 저장이 되어 있다. 이 $rbx값을 0으로 바꿔준다면 flag를 얻을 수 있을 것이다. 다음 사진은 write 함수 호출 전까지의 레지스터 상태이다. mov BYTE PTR [rbp+rdx*1-0x1], 0x0 -> rbp+rdx*1-0x1이 가리키는 주소에 0을 저장한다 그럼 값이 저장되는 과정을 살펴보자 $rbp, $..

Article Thumbnail