[C++ Korea] Effective Modern C++ Study item 24-26Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26
Item 24: Distinguish universal references from rvalue references. +석정로
Item 25 : Use std::move on rvalue references,
std::forward on universal references. +서승덕
Item 26 : Avoid overloading on universal references. +윤석준
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
[C++ Korea] Effective Modern C++ Study item 24-26Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26
Item 24: Distinguish universal references from rvalue references. +석정로
Item 25 : Use std::move on rvalue references,
std::forward on universal references. +서승덕
Item 26 : Avoid overloading on universal references. +윤석준
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Item 20, 21, 23
Item 20 : Use std::weak_ptr for std::shared_ptr-like pointers that can dangle. +정은식
Item 21 : Prefer std::make_unique and std::make_shared to direct use of new. +이동우
Item 23 : Understand std::move and std::forward. +제한재
2010 CodeEngn Conference 04
2010년 5월 22~24일, 세계 최대의 해커들의 축제인 DEFCON 18의 CTF 예선이 열렸습니다. Kaist 보안동아리 GoN 팀으로 참여하면서 느낀 이번 DEFCON CTF 예선에 대한 전반적인 리뷰와 함께, 여러 문제 분야들 중 Binary l33tness, Pwtent pwnables 분야의 문제들의 풀이를 해보고자 한다. (Defcon 18 CTF 예선전 전체 529팀에서 6위로 본선진출)
http://codeengn.com/conference/04
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Item 20, 21, 23
Item 20 : Use std::weak_ptr for std::shared_ptr-like pointers that can dangle. +정은식
Item 21 : Prefer std::make_unique and std::make_shared to direct use of new. +이동우
Item 23 : Understand std::move and std::forward. +제한재
2010 CodeEngn Conference 04
2010년 5월 22~24일, 세계 최대의 해커들의 축제인 DEFCON 18의 CTF 예선이 열렸습니다. Kaist 보안동아리 GoN 팀으로 참여하면서 느낀 이번 DEFCON CTF 예선에 대한 전반적인 리뷰와 함께, 여러 문제 분야들 중 Binary l33tness, Pwtent pwnables 분야의 문제들의 풀이를 해보고자 한다. (Defcon 18 CTF 예선전 전체 529팀에서 6위로 본선진출)
http://codeengn.com/conference/04
Session management is a fundamental security component that enables web applications to uniquely identify and track individual users across multiple requests. Weaknesses in how sessions are implemented can allow attackers to hijack other users' sessions. There are two main categories of vulnerabilities: weaknesses in how session tokens are generated, and weaknesses in how tokens are handled throughout their lifecycle. Predictable, meaningful, or insecurely encrypted tokens may allow attackers to determine or manipulate the tokens of other users.
The document provides an overview of key concepts related to web application technologies including the HTTP protocol, web functionality, and encoding schemes. It discusses HTTP requests and responses, common HTTP methods like GET and POST, URLs, REST, HTTP headers, cookies, status codes, HTTPS, and HTTP proxies. It also covers server-side and client-side functionality, sessions, URL encoding, HTML encoding, and serialization frameworks.
1. BSides Delhi CTF 2018 WriteUp
st4t1c (Reversing 200points)
by 이 세 한 (Alchemic)
2. 2
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
다음과 같이 문제가 주어집니다.
문제의 설명으로 보았을 때, 정적 분석 문제로 보여집니다.
3. 3
우선 문제 파일이 무엇인지 확인해보도록 하겠습니다.
ELF 64-bit 파일이므로 리눅스 바이너리 실행 파일이며, 64bit 환경에서 동작하는 것이라고
파악할 수 있습니다.
문제에 이미 정적 분석(static analysis)이라는 말이 나와있으므로, IDA Pro 로 바이너리를
열어서 분석을 진행하도록 하겠습니...???
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
왜 main 함수가 없지??
Graph Mode로 보여주는 것을 실패?!
4. 4
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
메인 함수도 없고... 그래프 모드로 보여주는 기능도 안된다고 합니다.
아무래도 IDA Pro 가 바이너리를 제대로 해석을 하지 못하는 것으로 보여집니다.
Anti Analysis 기법이 적용된 바이너리인지 조사를 진행해보도록 하겠습니다.
???
5. 5
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
코드를 조사하다보면 중간 중간에 0xCC (INT instruction) 가 있는 것을 확인할 수 있습니다.
이는 Anti Analysis 기법 중 하나로서 일부 바이트가 분기의 fallthrough 위치에 기록되어서
디컴파일러가 제대로 해석을 하지 못하도록 하는 것입니다.
이는 간단하게 0x90 (NOP instruction) 으로 패치를 진행해주면 디컴파일러가 다시 제대로
해석을 할 수 있게 됩니다.
6. 6
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
위 그림과 같이 HEX Editor 를 이용하여 0xCC (INT instruction) 을 검색하여 해당 부분을
0x90 (NOP instruction) 으로 수정하면 패치가 완료됩니다.
모든 부분을 수정한 뒤, 다시 IDA Pro 를 이용하여 바이너리를 열게 되면 제대로 해석이 되어서
분석을 쉽게 할 수 있게 되는 것을 확인할 수 있습니다.
7. 7
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
패치를 진행하고 다시 IDA Pro 를 이용하여 바이너리 파일을 열게 되면, 이번에는 제대로
main 함수가 나타나고, main 함수의 C 스타일 의사 코드도 제대로 해석이 되어서 분석을
진행할 수 있는 상태가 되는 것을 확인할 수 있습니다.
이제 본격적으로 분석을 진행하도록 하겠습니다.
8. 8
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
먼저 main 함수를 분석해보면 다음과 같은 간단한 알고리즘으로 볼 수 있습니다.
Start
s1 = 환경 변수 ‘team_name’의 값
s1 == “bi0s”
End
argc == 2
sub_7EC(s1,
argv[1]) == 1
sub_7A0(argv[1])
Y
Y
Y
N
N
N
①
②
③
① s1에 환경 변수 ‘team_name’의 값을 저장
하는데, 이를 바로 “bi0s”와 비교를 하므로,
s1에 저장되는 문자열은 “bi0s” 인 것을 확인
할 수 있습니다.
② 앞서 확인된 환경 변수 ‘team_name’의 값인
“bi0s” 문자열과 main 함수의 두 번째 인수
(argv[1])를 sub_7EC 함수에 인자로 전달하고,
함수에서 리턴값이 1인지 아닌지를 판단하게
됩니다.
③ 이전 ② 에서 true가 되면 main 함수의 두 번째
인수인 argv[1]을 sub_7A0 함수에 인자로 전달
하게 됩니다.
9. 9
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
메인 함수에서 살펴보았을 때, 두 함수 (sub_7EC, sub_7A0) 가 등장 했으므로, 두 함수를
분석하도록 하겠습니다.
먼저, sub_7A0 함수를 분석해보면, 단순히 main 함수에서 넘겨받은 인수를 출력해주는
함수인 것을 알 수 있습니다.
그리고 출력을 할 때, 플래그를 출력해주는 것으로 보아 넘겨받은 인수가 flag 인 것을 알 수
있습니다!
즉, 메인 함수에서 분석한 알고리즘에 의하면 argv[1] 이 flag 인 것입니다!
결국 이 바이너리는 flag 문자열을 입력받고 그 flag 가 옳은 것인지 확인하는 바이너리로
판단할 수 있습니다.
10. 10
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
[sub_7EC 함수의 어셈블리 코드 일부분]
[sub_7EC 함수의 C 스타일 의사 코드]
11. 11
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
sub_7EC 함수에서의 알고리즘을 분석해보도록 하겠습니다.
함수에서의 두 인수 a1, a2는 각각 main 함수에서의 s1, argv[1] 입니다.
먼저, 특정 바이트들이 입력되어 있는 것을 확인할 수 있습니다.
다음으로 함수의 인수 중 a2 의 문자열 길이가 22 인지를 판단하는 부분이 나타납니다.
22자리 문자열이 맞으면, 변수 v14의 값을 구하는 연산이 등장합니다.
v14 = ‘b’ + ‘i’ + ‘0’ + ‘s’ = 0x62 + 0x69 + 0x30 + 0x73 = 0x16E / 30 = 0xc
v14 의 값을 구했고, 그 다음 연산을 분석해보도록 하겠습니다.
그 다음 연산은 인수 a2 를 이용해서 새로운 값을 계산하는 과정이 나타납니다.
13. 연산을 거쳐서 변수 v5 에 연산된 값이 저장되는 것을 확인하였습니다.
다음으로는 v5 에 저장된 값과 미리 입력되어 있던 특정 바이트 들과 비교하는 코드를 확인할 수
있습니다.
13
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
v5 : ??? ??? ??? ??? ??? …??? ??? ??? ??? ??? ??? ???
특정 바이트 : 0x7C 0x23 0x34 0x62 0x7E 0x57 0x37 0x68 0x3B 0x57 0x35 0x3F…
서로 같은가?
return 0;
N
result = 1;
22번 반복이 모두 끝나면
14. 14
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
앞서 12쪽과 13쪽에서 살펴본 연산 과정들을 이용하면 main 함수 에서의 argv[1] 입력값을
찾아낼 수 있습니다.
15. 15
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
드디어 flag 를 확인할 수 있습니다!
The flag is... flag{l34rn_7h3_b451c5_f1r57}