I wrote a challenge some time back on Securabit podcast I am a part of as a fun exercise. The question came from someone trying to reverse this challenge.
The anti-debugging technique was accessing the PEB offset +68 to detect if the debugger is attached. This is set to 70 when a debugger is attached. To find the base address of PEB I accessed FS and stored that in a register.
Ok I skimmed over some items there like why is it set to 70 and what is the PEB but that is not the question. The question is what is FS.?
FS is a segment register that was added with the release of protected x86 32bit operating systems. Typically, in win32, FS points to the base of the Thread Information Block of the current active thread in PEs.
To break this down even more when you see commands such as
mov EBX, DWORD PTR DS[EAX]
the DWORD pointer is saying start with base address of DS (another segment register) and add the value EAX to this and store that in EBX. so when I accessed
mov EAX, DWORD PTR FS
I was saying take the value in FS and add 30 to that and return what is there. This address stores the Base of the PEB.
Few other notes on FS:
FS stores the pointer to the first SEH in the link list. This is usually called when an exception occurs in code.
FS points to the current active thread. This means a single application with multiple threads will have multiple pointers to different Thread Blocks.
Source for Challenge