امروز ۳بار توی دیباگ با یه مشتریمون حواسم نبود و گفتم عرض میکردید.
🤣8😁1🥱1
In modern CPUs, especially in the context of the amd64 architecture, the distinction between code and data is not made through segmentation but through a different mechanism called paging, which is part of the memory management unit (MMU).
Here's how the CPU identifies what is code and what is data:
1. Paging:
The MMU uses a page table to map virtual addresses to physical addresses. Pages can be flagged as executable or non-executable, which helps the CPU determine if the content at a particular address is code or data.
2. Protection Flags:
Each page in the page table has protection flags that indicate whether it contains code, data, or both, and whether it is readable, writable, or executable. The CPU uses these flags to enforce access controls.
3. Program Loading:
When a program is loaded into memory, the operating system loads the executable code into pages marked as executable. The data sections are loaded into separate pages with appropriate flags.
4.Instruction Pointer (IP):
The IP register in the CPU points to the next instruction to be executed. The CPU fetches instructions from the memory location pointed to by the IP. If the IP points to a non-executable page, an exception is raised.
5. Modern CPU Features:
Features like the NX (No Execute) bit are used to prevent execution of code from areas of memory marked as non-executable, which is typically where data resides.
In summary, while segmentation as a primary method for separating code and data is not used in the same way as it was in older architectures, modern systems use a combination of paging, protection flags, and CPU features to manage memory and distinguish between code and data effectively
Here's how the CPU identifies what is code and what is data:
1. Paging:
The MMU uses a page table to map virtual addresses to physical addresses. Pages can be flagged as executable or non-executable, which helps the CPU determine if the content at a particular address is code or data.
2. Protection Flags:
Each page in the page table has protection flags that indicate whether it contains code, data, or both, and whether it is readable, writable, or executable. The CPU uses these flags to enforce access controls.
3. Program Loading:
When a program is loaded into memory, the operating system loads the executable code into pages marked as executable. The data sections are loaded into separate pages with appropriate flags.
4.Instruction Pointer (IP):
The IP register in the CPU points to the next instruction to be executed. The CPU fetches instructions from the memory location pointed to by the IP. If the IP points to a non-executable page, an exception is raised.
5. Modern CPU Features:
Features like the NX (No Execute) bit are used to prevent execution of code from areas of memory marked as non-executable, which is typically where data resides.
In summary, while segmentation as a primary method for separating code and data is not used in the same way as it was in older architectures, modern systems use a combination of paging, protection flags, and CPU features to manage memory and distinguish between code and data effectively
👍6
ایدهای ندارم مشکل این گوشی جدیدم چیه. ولی وقتی که به وایفای خونه وصل میشه، یهو باطریش دقیقهای یک درصد کم میشه و شروع میکنه به شدت داغ شدن.
💩8😐3🤯1🍌1💔1
به هر وایفای دیگهای وصل میشه هیچ مشکلی نداره، فقط وقتی به این وایفای خونه وصل میشه مشکل میخوره.
💩7🤔4🍌1😐1
حتی مثلا وایفای خونه رو با یه گوشی دیگه شیر کنم و وصل به اون گوشیه، بازم مشکلی نمیخوره. :/
💩7😐2🍌1
یک سوال CTF که امروز باهاش اشنا شدم، حلشو بعدش میذارم ببینید.
چیز عجیبی نداره، صرفا جالب بود:
چیز عجیبی نداره، صرفا جالب بود:
.>+,[<-<.[,<<.--+[.<<[
🤓6👌1
اونجایی دیگه علاقم به CTF رو از دست دادم که با نیما نشستیم ۲۴ ساعت پای یک سوال pwn که فقط یک solve داشت و هر راهی که میرفتیم حل نمیشد و بعد پایان مسابقه فهمیدیم سوال غلط بوده و اون یه تیم هم رندوم فلگ رو سابمیت کرده.
😁8🔥3💩2👍1
امروز پلن Fuzz کردن libgd با استفاده از aflgo عه. با ما همراه باشید.
🔥4👍2💩2
من کلا یک مقدار از نیازمندیم بگم، اینشکلیه که ما یک سری patch داریم که حدس میزنیم اینا آسیبپذیرن. اما خب برای اینکه مطمئن شیم هستن یا نه نیاز هست که exploit شن. این exploit کردنشون کار خیلی سادهای نیست چون هم پروژهها گندهن و هم کلا exploit کردن یک پروژه بزرگ خیلی سخته، لذا در نهایت میخوایم اونایی رو exploit کنیم که مطمئنیم آسیبپذیرن. حالا برای اینکه بفهمیم آسیبپذیرن یا نه، میخوایم از یک فازر استفاده کنیم که اگر اونجا توی اون نقطه از diff که ما حدس زدیم آسیبپذیره، اون پروژه کرش کرد، حالا ما دیگه شروع کنیم به اکسپلویت کردنش.
برای این کار نیاز به یک فازری داریم که دقیقا اون نقطهای که ما مد نظرمون هست رو فاز کنه برامون. حالا فازرها کلا نوعهای مختلفی دارن و ما به عبارتی فازری میخوایم که به اون نقطه برسه (یعنی مطمئن باشیم که اون نقطه و یا در واقع اون node از گرافمون داره cover میشه)
این aflgo یک فازریه که کدبیسش همون afl معروفه اما میتونه به صورت directed اون جایی که ما خودمون نیاز داریم رو هم فاز کنه.
به عبارتی این توی دیسکپریشن خودشه:
AFLGo is an extension of American Fuzzy Lop (AFL). Given a set of target locations (e.g., folder/file.c:582), AFLGo generates inputs specifically with the objective to exercise these target locations.
درکل فازر جالبیه ولی کار باهاش خیلی سخته. نه داکیومنت درستی داره نه هیچی.
این ریپوشونه:
https://github.com/aflgo/aflgo
اینم مقالهشون:
https://mboehme.github.io/paper/CCS17.pdf
برای این کار نیاز به یک فازری داریم که دقیقا اون نقطهای که ما مد نظرمون هست رو فاز کنه برامون. حالا فازرها کلا نوعهای مختلفی دارن و ما به عبارتی فازری میخوایم که به اون نقطه برسه (یعنی مطمئن باشیم که اون نقطه و یا در واقع اون node از گرافمون داره cover میشه)
این aflgo یک فازریه که کدبیسش همون afl معروفه اما میتونه به صورت directed اون جایی که ما خودمون نیاز داریم رو هم فاز کنه.
به عبارتی این توی دیسکپریشن خودشه:
AFLGo is an extension of American Fuzzy Lop (AFL). Given a set of target locations (e.g., folder/file.c:582), AFLGo generates inputs specifically with the objective to exercise these target locations.
درکل فازر جالبیه ولی کار باهاش خیلی سخته. نه داکیومنت درستی داره نه هیچی.
این ریپوشونه:
https://github.com/aflgo/aflgo
اینم مقالهشون:
https://mboehme.github.io/paper/CCS17.pdf
GitHub
GitHub - aflgo/aflgo: Directed Greybox Fuzzing with AFL
Directed Greybox Fuzzing with AFL. Contribute to aflgo/aflgo development by creating an account on GitHub.
🔥6👎1
اون آسیبپذیری محتمل هم که دنبالشم اینجاس:
https://github.com/libgd/libgd/blob/master/src/gd_tga.c
خط ۲۵۷
در کل این تابع
آسیبپذیریهاشم خیلی احمقانهس اتفاقا، یعنی کل آسیبپذیریهایی که از این تابع خوندم من دلیلش برمیگرده به این که اینا نیومدن return value این تابع رو چک بکنن. یعنی اگر صرفا توی یک if بذارن هندل میشه ماجرا.
یک سری آسیبپذیری دیگههم داره البته که اگر دوست داشتید میتونید برید بخونید توی cve mitre
https://github.com/libgd/libgd/blob/master/src/gd_tga.c
خط ۲۵۷
در کل این تابع
gdGetBuf آسیبپذیره و زیاد هم ازش ریپورت شده مخصوصا برای این پروژه libgd.آسیبپذیریهاشم خیلی احمقانهس اتفاقا، یعنی کل آسیبپذیریهایی که از این تابع خوندم من دلیلش برمیگرده به این که اینا نیومدن return value این تابع رو چک بکنن. یعنی اگر صرفا توی یک if بذارن هندل میشه ماجرا.
یک سری آسیبپذیری دیگههم داره البته که اگر دوست داشتید میتونید برید بخونید توی cve mitre
GitHub
libgd/src/gd_tga.c at master · libgd/libgd
GD Graphics Library. Contribute to libgd/libgd development by creating an account on GitHub.
🔥5👍1👎1
یک چلنج فوق العادههههههههه زیبا. (بینهایت هم gdb یاد میگیرید با حلش.) فردا توضیحش میدم چجوری حل میشه. شوخوش.
❤8👎1
خب برسیم به توضیح این سوال. کد پایتونش رو اگر ببینید، اومده یک لایبرری ایمپورت کرده به اسم gdb.
خب حالا gdb چیه؟gdb یا به عبارتی GNU Debugger یک دیباگری هست که برای زبونهای سطح پایینی مثل اسمبلی و c و cpp و ایناها هست. میدونم که بعضا go یا جاوا هم حتی باهاش دیباگ میکنن. کلا یک ابزار خیلی خفنیه که روی سیستمهای یونیکسی میتونه اجرا شه و یک باینری رو دیباگ کنه.
همه کار هم میشه باهاش کرد. از سادهترین چیزا مثل بریکپوینت گذاشتن و رفتن به دستور بعدی و در همون لحظه دیدن مقادیر متغیرا، ورودیهای تابعها، مقادیر رجیسترها، استک، هیپ و ... هرچی که فکرشو کنید.
تا یک سری کارای خفنتر، مثلا در لحظه (runtime) عوض کردن مقادیر. مثلا ورودی یک تابع اگر هست ۲ اون رو تغییر بدید به ۵. یا در لحظه اگر روی خط ۵ برنامه هستید جامپ کنید برید به خط ۱۰.
کلا تقریبا هرکاریییی که دلتون بخواد با این دیباگر با اون برنامه میتونید انجام بدید
خب حالا gdb چیه؟gdb یا به عبارتی GNU Debugger یک دیباگری هست که برای زبونهای سطح پایینی مثل اسمبلی و c و cpp و ایناها هست. میدونم که بعضا go یا جاوا هم حتی باهاش دیباگ میکنن. کلا یک ابزار خیلی خفنیه که روی سیستمهای یونیکسی میتونه اجرا شه و یک باینری رو دیباگ کنه.
همه کار هم میشه باهاش کرد. از سادهترین چیزا مثل بریکپوینت گذاشتن و رفتن به دستور بعدی و در همون لحظه دیدن مقادیر متغیرا، ورودیهای تابعها، مقادیر رجیسترها، استک، هیپ و ... هرچی که فکرشو کنید.
تا یک سری کارای خفنتر، مثلا در لحظه (runtime) عوض کردن مقادیر. مثلا ورودی یک تابع اگر هست ۲ اون رو تغییر بدید به ۵. یا در لحظه اگر روی خط ۵ برنامه هستید جامپ کنید برید به خط ۱۰.
کلا تقریبا هرکاریییی که دلتون بخواد با این دیباگر با اون برنامه میتونید انجام بدید
👍4❤1👎1
برای حل این سوال حقیقتا یک دانش پایهای از c اگر داشته باشید و با gdb مقداری کار کرده باشید و یک مقدار خیلی کوچک و ریزی هم os بلد باشید (نباشید هم با سرچ در میاد) کار تمومه
👍4❤1👎1