write up
-
[TJCTF 2019] Slice of PIE write upCTF Write-Up 2019. 4. 18. 11:36
PIE에 관한 문제입니다. PIE란? Position Independent Executable의 줄임말로, 전체가 위치 독립 코드로 이뤄진 실행 가능한 바이너리입니다. PIE는 위치 독립 실행파일이고, 실행할 때마다 매핑되는 주소가 어디든지에 상관없이 시행되는 파일로, 바이너리의 주소를 랜덤화 하여 바이너리의 특정 주소의 값을 수정하는 것과 같은 공격을 방어합니다. Ref : https://bpsecblog.wordpress.com/2016/06/10/memory_protect_linux_4/ 풀이를 위해 어떤 파일인지 알아봅시다. 해당 바이너리는 NX, PIE, Full RELRO가 걸려있습니다. 또 stripped되어있어서 심볼이 삭제되어 있습니다. 다음으로 디컴파일을 해보겠습니다. main()에서 ..
-
Stack7 풀이System hacking training/Protostar 2019. 4. 11. 01:50
#include #include #include #include char *getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xb0000000) == 0xb0000000) { printf("bzzzt (%p) ", ret); _exit(1); } printf("got path %s ", buffer); return strdup(buffer); } int main(int argc, char **argv) { getpath(); } Stack의 마지막 문제 풀이를 해봤습니다. 이 문제의..
-
CBM CTF 2019 write upCTF Write-Up 2019. 4. 10. 01:10
첫번째 pwn1번 문제다. 64bit 바이너리, NX와 PIE가 걸려있고 readme 파일을 읽었을 때 remote로 접속해서 쉘을 따야한다. buf에 getnumber의 return값과 같은 값을 넣어야하는데 get number()로 가보면 다음과 같이 고정적인 값을 return 해준다. 따라서 input값을 넣어주면 끝 %d로 입력받으니까 10진수로 넣어줘하는 것만 생각해주면 된다. 다음으로 푼 문제다. 64bit 바이너리, 역시 remote 익스해야한다. mitigation은 NX, PIE가 걸려있다. 헥스레이로 디컴파일 결과 print_flag()가 있고 이 함수가 호출되면 flag가 출력된다. 이 함수가 호출되기 위한 조건을 보면 v4 + v5의 값이 152보다 작거나 같아야하는데 첫번째 if문..
-
[Toddler's Bottle] leg write upSystem hacking training/pwnable.kr 2019. 1. 28. 17:22
arm에 관한 문제를 풀어봤습니다. Daddy told me I should study arm. But I prefer to study my leg! Download : http://pwnable.kr/bin/leg.c Download : http://pwnable.kr/bin/leg.asm ssh leg@pwnable.kr -p2222 (pw:guest) 이 문제는 arm 어셈블리언어를 알아야 풀 수 있습니다. 주어진 두 링크를 들어가보면 C코드와 어셈블리 코드가 주어집니다. 여기서 저는 어셈블리 코드로 분석을 진행했는데요. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\..
-
heap2 풀이System hacking training/Protostar 2018. 12. 22. 22:30
[heap2.c] heap2는 heap overflow, use after free를 이용한 문제인것 같다. 코드상에 auth chunk의 데이터가 들어가는 주소를 출력해주는 부분이 있는데, 이를 이용해서 쉽게 "you have logged in already!"라는 문구를 띄울 수 있다. 처음 "auth "를 입력하면 auth구조체의 크기 만큼 malloc을 해주는데 이 위치가 0x804c008이다. 이후 service를 입력하면 0x804c018의 위치에 메모리를 할당 받고, string을 복사해주는데, 이는 strdup()의 특성이다. strdup()는 malloc() + strcpy()인데, malloc()을 호출하여 string의 사본에 대한 기억장치 공간을 예약한다. 예를 들어 strdup("..
-
heap1 풀이System hacking training/Protostar 2018. 12. 21. 11:57
[heap1.c] #include #include #include #include #include struct internet { int priority; char *name; }; void winner() { printf("and we have a winner @ %d\n", time(NULL)); } int main(int argc, char **argv) { struct internet *i1, *i2, *i3; i1 = malloc(sizeof(struct internet)); i1->priority = 1; i1->name = malloc(8); i2 = malloc(sizeof(struct internet)); i2->priority = 2; i2->name = malloc(8); strcpy..
-
heap0 풀이System hacking training/Protostar 2018. 12. 21. 10:23
[heap0.c] #include #include #include #include #include struct data { char name[64];};struct fp { int (*fp)();};void winner(){ printf("level passed\n");}void nowinner(){ printf("level has not been passed\n");}int main(int argc, char **argv){ struct data *d; struct fp *f; d = malloc(sizeof(struct data)); f = malloc(sizeof(struct fp)); f->fp = nowinner; printf("data is at %p, fp is at %p\n", d, f);..
-
RITSEC CTF 2018 ezpwn write upCTF Write-Up 2018. 11. 19. 18:47
라즈베리파이 Mate ubuntu 가 apt upgrade를 하던 중 너무 오래걸려서 할게 없었는데 마침 CTF를 하고 있었네요..ㅎㅎ 쉬는 시간에 한 문제 풀었습니다! 210 Solves라 쉬운 문제였습니다. 문제는 바이너리 던져주고, remote exploit을 해야하는(?) 그런 문제 유형이였습니다. 먼저 정적분석을 위해 binary를 열어보니 다음과 같이 unsigned int v6의 값이 1이 된다면 if문의 조건을 충족하여 flag를 열어주는 것을 볼 수 있습니다. 취약점이 쉽게 눈에 들어오는데요. gets()의 사용으로 인해서 v4의 변수에 argv값을 NULL byte가 오기 전까지 모두 값복사를 하기 때문에 bof가 터집니다. 이제 이에 맞게 payload를 작성하면 됩니다. CTF에 나..