일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- rev-basic-3
- 드림핵
- CodeEngn
- sint
- basic_exploitation_001
- L18
- 코드엔진 베이직 13
- Dreamhack
- coin1
- rev-basic-1
- L15
- Basic
- pwnable.kr
- rev-basic-2
- rev-basic-6
- 포너블
- rev-basic-0
- rev-basic-5
- L17
- off_by_one_001
- rev-basic-7
- sd카드 리더기
- L16
- out_of_bound
- Pwnable
- rev-basic-4
- basic_exploitation_000
- 코드엔진 베이직
- RCE
- off_by_one_000
- Today
- Total
목록Pwnable (26)
서브웨이
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bHIx86/btq93o5mGYZ/wmIbifqKYyw8zGDO2R7vck/img.png)
문제를 보면 간단하게 포맷스트링버그를 사용하는 문제인 것 같습니다. 일단 소스코드를 봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); read(0, buf, 0x80); ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/XvcIp/btq91OP1RyJ/1EUqfd4Oru7dlgkdxoqGt1/img.png)
바로 다음 문제를 풀어봅시다. 아까와 같은 형태의 문제네요. 일단 소스코드를 열어봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void read_flag() { system("cat /flag"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0;..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/SjcQj/btq9RewiooF/S3qqOo2OiOGssqZJlKu5J0/img.png)
오랜만에 글을 쓰네요. 그동안 프로젝트와 진로에 대한 고민을 하느라 업로드를 쉬었습니다. 이제 다시 차근차근 올려보겠습니다. 첫 문제답게 간단해보입니다. 참고에 Return Address Overwrite가 써있는걸로 봐서 그냥 리턴 주소만 덮어씌우면 될 것 같습니다. 그럼 문제 파일을 봅시다. 파일은 이렇게 두개로 구성되어 있습니다. 먼저 C 소스코드를 봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, a..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/nS7IL/btqJogSy69M/gkZhBh52q3pcUk7akBjjP0/img.png)
뭔가 쉬어가는 문제랍니다. 평소와는 다르게 리드미 파일이 있네요. 읽어봅시다. 일단 여기있는 소스코드는 보기용 파일이고 진짜 실행을 위한 소스코드는 9022 포트로 접속하면 있답니다. 일단 소스코드를 봅시다. // compiled with : gcc -o memcpy memcpy.c -m32 -lm #include #include #include #include #include #include #include unsigned long long rdtsc(){ asm("rdtsc"); } char* slow_memcpy(char* dest, const char* src, size_t len){ int i; for (i=0; i= 64){ i = len / 64; len &= (64-1); while(i--..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdfxjf/btqHbYVYAWq/qNj7AIvRics2ZVUApDUY30/img.png)
UAF(Use After Free) 취약점에 관한 문제 입니다. 일단 uaf가 무엇인지 먼저 알아봅시다. https://woosunbi.tistory.com/95 Use-After-Free 취약점 UAF(Use-After_free) 취약점이란 무엇인가? : UAF 취약점이란, 프로그래머가 Heap 영역을 잘못 다룰 때 발생하는 취약점으로, 가령 우리가 Heap 영역을 사용한 후 Free 하고 재사용(reallocation) 할 경우 일어 woosunbi.tistory.com 간단히 말해 A변수에 동적할당 후 해당 값을 사용한 뒤 해제를 하고 B라는 값에 동적할당을 해주면 A에서 사용한 값이 그대로 남아있는 취약점을 말합니다. 일단 접속해봅시다. 언제나처럼 소스코드를 먼저 봅시다. 이번 파일은 특이하게 C..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/UXnKx/btqHgqQCyvP/c9K0g2CUkXIfMRv2exExU0/img.png)
이 문제또한 cmd1과 같이 우회를 연습하는 문제인 듯 합니다. 일단 봅시다. 일단 소스코드 먼저 봅시다. #include #include int filter(char* cmd){ int r=0; r += strstr(cmd, "=")!=0; r += strstr(cmd, "PATH")!=0; r += strstr(cmd, "export")!=0; r += strstr(cmd, "/")!=0; r += strstr(cmd, "`")!=0; r += strstr(cmd, "flag")!=0; return r; } extern char** environ; void delete_env(){ char** p; for(p=environ; *p; p++)memset(*p, 0, strlen(*p)); } int m..